QTextStream - Что именно возвращает метод position
У меня есть вопрос о том, что QTextStream рассчитывает с pos()
метод. Я предположил, что это было количество байтов, но, похоже, это не так.
Причина, по которой я спрашиваю, состоит в том, что я обрабатываю строки в файле, и как только число прочитанных строк достигло некоторого произвольного числа или stream.atEnd()
правда, я вырываюсь из цикла и сохраняю stream.pos()
к qint64*
переменная. После завершения обработки я возвращаюсь к файлу и seek(*filePosition)
чтобы вернуться к моей последней позиции и получить больше данных, пока stream.atEnd()
правда. Это работает в том смысле, что может отслеживать, где я нахожусь, но это очень медленный вызов stream.pos()
как отмечено в документах Qt.
Я пытаюсь обновить позицию файла после того, как каждая строка будет прочитана эффективным способом. Однако это не работает, и когда программа возвращается к чтению файла снова, позиция не является правильной, так как первая строка, которую она читает, начинается в середине строки, ранее прочитанной на последней итерации.
Вот что есть до сих пор:
QTextStream stream(this);
stream.seek(*filePosition);
int ROW_COUNT = 1;
while (!stream.atEnd()) {
QString row = stream.readLine();
QStringList rowData = row.split(QRegExp(delimiter));
*filePosition += row.toUtf8().size();
/*
processing rowData...
*/
if (ROW_COUNT == ROW_UPLOAD_LIMIT) {
break;
}
ROW_COUNT++;
}
/*
close files, flush stream, more processing, etc...
*/
2 ответа
Решением было создать QTextStream
за пределами функции и передать его в качестве параметра. Это позволяет мне не беспокоиться об отслеживании позиции на каждой итерации, потому что я удерживаю поток в области видимости, пока полностью не обработаю файл.
class FeedProcessor {
...
void processFeedFile() {
IntegrationFile file("big_file.txt");
file.open(QIODevice::ReadOnly | QIODevice::Text);
QTextStream stream(&file);
while(!stream.atEnd()) {
file.extractFileContents(&stream);
/*
do more processing with file
*/
}
}
...
}
class IntegrationFile : public QFile {
...
void extractFileContents(QTextStream* stream) {
int ROW_COUNT = 1;
while (!stream.atEnd()) {
QString row = stream.readLine();
QStringList rowData = row.split(QRegExp(delimiter));
/*
processing rowData...
*/
if (ROW_COUNT == ROW_UPLOAD_LIMIT) {
break;
}
ROW_COUNT++;
}
/*
close files, flush stream, more processing, etc...
*/
}
...
}
QTextStream::pos
возвращает позицию в байтах. Я вижу следующие проблемы:
- Вы не учитываете символ конца строки (или 2 символа)
- В UTF-8 один символ может занимать более 1 байта
Кроме того, зачем сохранять позицию буфера после чтения каждой строки? Это может быть быстрее:
if (ROW_COUNT == ROW_UPLOAD_LIMIT) {
*filePosition = stream.pos();
break;
}