QTextStream - 位置方法究竟是什么 return

QTextStream - What exactly does the position method return

我对 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...
*/

QTextStream::pos returns 字节位置。我看到以下问题:

  1. 您没有考虑行结束字符(或 2 个字符)
  2. 在 UTF-8 中,单个字符可能需要超过 1 个字节

还有,为什么读完每一行都要保存缓冲区位置?这可能会更快:

if (ROW_COUNT == ROW_UPLOAD_LIMIT) {
    *filePosition = stream.pos();
    break;
}

解决方案是在函数外部创建 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...
         */
    }
    ...
}