QTextStream - position方法返回

时间:2016-02-18 18:30:35

标签: qt qt4 qt4.8 qtextstream

我对QTextStream使用pos()方法计算的内容有疑问。我假设它是字节数,但似乎可能不是这种情况。

我问的原因是,我正在处理文件中的行,一旦读取的行数达到任意数字或stream.atEnd()为真,我就会跳出循环并保存{{1}转到stream.pos()变量。处理完成后,我将返回文件并qint64*返回到我的上一个位置并获取更多数据,直到seek(*filePosition)为真。这可以跟踪我的位置,但调用stream.atEnd()非常慢,如Qt文档中所述。

我正在尝试的是在以有效的方式读取每一行之后更新文件位置。但是,它不起作用,当程序返回再次读取文件时,位置不正确,因为它读取的第一行在上一次迭代中先前读取的行的中间开始。

到目前为止:

stream.pos()

2 个答案:

答案 0 :(得分:2)

QTextStream::pos以字节为单位返回位置。我看到以下问题:

  1. 您没有考虑行结束字符(或2个字符)
  2. 在UTF-8中,单个字符可能需要超过1个字节
  3. 另外,为什么在读取每一行后保存缓冲区位置?这可能会更快:

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

答案 1 :(得分:0)

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