【问题标题】:QTextStream - What exactly does the position method returnQTextStream - 位置方法究竟返回什么
【发布时间】:2016-02-18 18:30:35
【问题描述】:

我有一个关于 QTextStream 使用 pos() 方法计算什么的问题。我认为这是字节数,但似乎情况并非如此。

我问的原因是,我正在处理文件中的行,一旦读取的行数达到某个任意数字或stream.atEnd() 为真,我就会跳出循环并将stream.pos() 保存到@ 987654324@ 变量。处理完成后,我会返回文件和 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...
*/

【问题讨论】:

    标签: qt qt4 qt4.8 qtextstream


    【解决方案1】:

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

    1. 您没有考虑行尾字符(或 2 个字符)
    2. 在 UTF-8 中,单个字符可能占用超过 1 个字节

    另外,为什么在读取每一行后保存缓冲区位置?这可能会更快:

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

    【讨论】:

    • 这就是我最初的想法——尽管我在 while 循环之外设置了一次位置。结果一样...
    • 如果你的文件只包含 ascii 字符,那么考虑行尾就足够了。
    • 感谢您的帮助,但我想通了。我在函数范围之外创建流并将其传递给指向它的指针。这将流保持在范围内,直到整个文件得到处理,而不是为文件的每次迭代创建一个新流
    • 另外,我尝试 +1 这个答案,但我没有足够的声望点。
    【解决方案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...
             */
        }
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      相关资源
      最近更新 更多