2010-12-14 6 views
2

Je suis en train d'ouvrir plusieurs fichiers simultanément (nombre aléatoire de fichiers) et de stocker leurs textstreams dans qlist pour simple à l'aide dans d'autres code:QT: Magasin QTextStream dans QList

QList<QTextStream> files; 
QList<QString> fnames; 
fnames.append("file1.txt"); 
fnames.append("file2.txt"); 
// ..and so on with random iterations 

// collect qtextsrams into qlist 
foreach (QString file, fnames) { 
     QFile f(file); 
     f.open(QIODevice::ReadOnly); 
     QTextStream textStream(&f); 
     files2.append(&textStream); 
} 

// use qtextstreams in a loop 
QList<QTextStream>::iterator i; 
for (i = files.begin(); i != files.end(); ++i) { 
     qDebug() << i->readLine(); 
} 

j'ai donc une erreur:

/make debug 
make -f Makefile.Debug 
make[1]: Entering directory `/home/pixx/Workspace/collocs' 
g++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -Idebug -o debug/main.o main.cpp 
main.cpp: In function ‘int main(int, char**)’: 
main.cpp:128: error: no matching function for call to ‘QList<QTextStream>::append(QTextStream*)’ 
/usr/include/qt4/QtCore/qlist.h:493: note: candidates are: void QList<T>::append(const T&) [with T = QTextStream] 
/usr/include/qt4/QtCore/qlist.h:819: note:     void QList<T>::append(const QList<T>&) [with T = QTextStream] 
main.cpp:117: warning: unused variable ‘cc’ 
In file included from /usr/include/qt4/QtCore/QList:1, 
       from main.cpp:1: 
/usr/include/qt4/QtCore/qtextstream.h: In member function ‘void QList<T>::node_copy(QList<T>::Node*, QList<T>::Node*, QList<T>::Node*) [with T = QTextStream]’: 
/usr/include/qt4/QtCore/qlist.h:695: instantiated from ‘void QList<T>::detach_helper(int) [with T = QTextStream]’ 
/usr/include/qt4/QtCore/qlist.h:709: instantiated from ‘void QList<T>::detach_helper() [with T = QTextStream]’ 
/usr/include/qt4/QtCore/qlist.h:126: instantiated from ‘void QList<T>::detach() [with T = QTextStream]’ 
/usr/include/qt4/QtCore/qlist.h:254: instantiated from ‘QList<T>::iterator QList<T>::begin() [with T = QTextStream]’ 
main.cpp:133: instantiated from here 
/usr/include/qt4/QtCore/qtextstream.h:258: error: ‘QTextStream::QTextStream(const QTextStream&)’ is private 
/usr/include/qt4/QtCore/qlist.h:386: error: within this context 
/usr/include/qt4/QtCore/qtextstream.h:258: error: ‘QTextStream::QTextStream(const QTextStream&)’ is private 
/usr/include/qt4/QtCore/qlist.h:399: error: within this context 
make[1]: Leaving directory `/home/pixx/Workspace/collocs' 
make[1]: *** [debug/main.o] Error 1 
make: *** [debug] Error 2 

Que dois-je réparer? Je comprends que c'est une question très simple, mais je ne peux pas trouver la bonne requête pour google :(

Répondre

4

La première erreur, à savoir "aucune fonction de correspondance pour l'appel à 'QList :: append (QTextStream *)'" est causée en vous utilisant l'opérateur & dans cette ligne:

files2.append(&textStream); 

Votre liste est censée être faite d'objets QTextStream, pas des pointeurs vers QTextStream objets

Mais le vrai problème est plus profond pour mettre un objet dans un.. liste, un objet doit avoir un constructeur de copie QTextStream n'en a pas, car il n'est pas clair comment diff Des copies identiques d'un même flux de texte devraient fonctionner ensemble. Je vous suggère de créer une liste de pointeurs vers des flux de texte, comme dans "QList". Bien sûr, dans ce cas, ne pas oublier de gérer leur destruction, quand ils ne sont plus nécessaires:

foreach (QTextStream *cur, files) delete cur; 

Si vous devez passer cette liste entre les différentes parties de votre code, faire des copies multiples de celui-ci et une telle , vous pouvez avoir besoin de pointeurs intelligents (QSharedPointer), mais je ne peux pas penser à une tâche où vous auriez besoin de le faire pour les flux de texte.

+0

Peut-être y a-t-il une solution plus simple pour mon problème initial? J'ai besoin d'ouvrir un nombre aléatoire de fichiers et ensuite lire des lignes simples de certains d'entre eux sans rouvrir. – pixx

+0

J'ai besoin de ceci pour implémenter l'algorithme pour fusionner les fichiers ordonnés en un: // - Ouvrir les fichiers de résultats N // - lire une ligne de chaque fichier // - jusqu'à ce que les deux fichiers soient complètement lus: // - sont les mots identique? // - yes -> écrire le mot et la somme dans votre fichier de sortie // lire la ligne suivante dans les deux fichiers // - no -> écrire uniquement le mot le plus bas de l'alphabet dans votre fichier de sortie // lire la ligne suivante du fichier de résultats de ces mots – pixx

2

J'ai trouvé une solution, merci Septagram pour l'idée! QList files2; // liste de fichiers à fusionner

QList<QTextStream> files; 
QList<QString> fnames; 
fnames.append("file1.txt"); 
fnames.append("file2.txt"); 
// ..and so on with random iterations 
QList<QFile *> files2; // file list to merge 
QList<QTextStream *> files3; 
foreach (QString file, files) { 
    files2.append(new QFile(file)); // create file obj 
    files2.last()->open(QIODevice::ReadOnly); // open file 
    files3.append(new QTextStream(files2.last())); // create textstream 
} 

QList< QTextStream * >::iterator i3; 
for (i3 = files3.begin(); i3 != files3.end(); ++i3) { 
     qDebug() << (*i3)->readLine(); 
} 
Questions connexes