QT: сохранить QTextStream в QList

Я пытаюсь открыть несколько файлов одновременно (случайное количество файлов) и сохранить их текстовые потоки в 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 :(


person pixx    schedule 14.12.2010    source источник


Ответы (2)


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

files2.append(&textStream);

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

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

foreach (QTextStream *cur, files) delete cur;

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

person Septagram    schedule 14.12.2010
comment
Может быть, есть более простое решение моей первоначальной проблемы? Мне нужно открыть случайное количество файлов и после этого прочитать отдельные строки из некоторых из них без повторного открытия. - person pixx; 14.12.2010
comment
Мне нужно это для реализации алгоритма объединения упорядоченных файлов в один: //- Открыть N файлов результатов //- прочитать строку каждого файла //- пока оба файла не будут полностью прочитаны: //- слова идентичны? // - да -> записать слово и сумму в ваш выходной файл // прочитать следующую строку в обоих файлах // - нет -> записать в ваш выходной файл только самое низкое по алфавиту слово // прочитать следующую строку из этого файл результатов слов - person pixx; 14.12.2010

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

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();
}
person pixx    schedule 14.12.2010