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 возвращает позицию в байтах. Я вижу следующие проблемы:

  1. Вы не учитываете символ конца строки (или 2 символа)
  2. В UTF-8 один символ может занимать более 1 байта

Кроме того, зачем сохранять позицию буфера после чтения каждой строки? Это может быть быстрее:

if (ROW_COUNT == ROW_UPLOAD_LIMIT) {
    *filePosition = stream.pos();
    break;
}
Другие вопросы по тегам