2010-12-14 9 views
2

Я пытаюсь открыть несколько файлов одновременно (случайное число файлов) и хранить их textstreams в QList для простого использования в другом коде:QT: Хранить QTextStream в 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(); 
} 

Так у меня есть ошибка:

/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 

Что я должен исправить? Я понимаю, что это очень простой вопрос, но я не могу найти правильный запрос для google :(

ответ

4

Первая ошибка, а именно: «Отсутствие подходящей функции для вызова в« QList :: append (QTextStream *) » вами с помощью & оператора в этой строке:

files2.append(&textStream); 

Ваш список должен быть изготовлен из объектов QTextStream, а не указатели на QTextStream объектов

Но реальная проблема лежит глубже, чтобы поместить объект в.. list, объект должен иметь конструктор копирования. QTextStream его не имеет, поскольку неясно, как diff оригинальные копии одного и того же текстового потока должны работать вместе. Я предлагаю вам создать список указателей на текстовые потоки, как в «QList». Конечно, в этом случае не забудьте обработать их разрушение, когда они больше не нужно:

foreach (QTextStream *cur, files) delete cur; 

Если вам нужно передать этот список между различными частями кода, сделать несколько копий этого и такого , вам могут понадобиться интеллектуальные указатели (QSharedPointer), но я едва ли могу придумать задачу, в которой вам нужно будет сделать это для текстовых потоков.

+0

Возможно, существует более простое решение для моей первоначальной проблемы? Мне нужно открыть случайное число файлов и после этого прочитать отдельные строки из некоторых из них без повторного открытия. – pixx

+0

Мне нужно это, чтобы реализовать алгоритм слияния упорядоченных файлов в один: // - Открыть файлы результатов N // - прочитать строку каждого файла // - пока оба файла не будут полностью прочитаны: // - это слова идентичны? // - yes -> записать слово и сумму в выходной файл // читать следующую строку в обоих файлах // - no -> записать только самое младшее в алфавите в ваш выходной файл // читать следующая строка из этого слова 'файл результатов – pixx

2

Я нашел решение, спасибо Septagram за идею! QList files2; // список файлов для объединения

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(); 
}