【问题标题】:How to report progress without going through the entire file before I process在我处理之前如何在不浏览整个文件的情况下报告进度
【发布时间】:2018-01-25 14:24:02
【问题描述】:

我必须解析一个包含数千条记录的大文件。我想显示一个进度条,但我不知道提前录制的数量。我必须滚动此文件两次吗?

  • 第一个知道录音数量。
  • 第二个进行治疗

或者有没有更简单的方法来获取记录数,而无需在处理之前遍历整个文件?

我的代码 sn-p:

void readFromCSV(const QString &filename){

    int line_count=0;
    QString line;           

    QFile file(filename); 
    if(!file.open(QFile::ReadOnly | QFile::Text))
        return;

    QTextStream in(&file);

    while(!in.atEnd()){                             //First loop
        line = in.readLine();           
        line_count++;
    }

    while (!in.atEnd()) {                           //Second loop
        ...
        line = in.readLine();
        process();
        ...
    }
}

感谢您的帮助

这个问题与这里的不同:counting the number of lines in a text file

1) 循环过程已经完成。在这种情况下是防止双重射击。

2) 代码是 QT 代码,而不是作为冗余添加的 C++ 函数

【问题讨论】:

  • Qt 不能处理你想要的,一般建议最好使用标准 C++,如果你想计算多少行你必须读取文件,没有其他方法.与您的实现相比,另一篇文章的解决方案是最佳的。Qt 使用 C ++,因此 C ++ 解决方案也是 Qt 解决方案
  • 这个文件是从哪里来的?如果它是由您的应用程序生成的,您可以将记录数放在第一行。

标签: qt qfile


【解决方案1】:

我认为如果不读取文件至少一次就无法计算行数。为了避免这种情况,我不会依赖于行数,而是依赖于我读取了多少数据。以下是我将如何解决这个问题:

QFile file(fileName);
file.open(QFile::ReadOnly | QFile::Text);

const auto size = file.size();

QTextStream in(&file);
while (!in.atEnd()) {
  auto line = in.readLine();
  // Process line.
  // [..]

  // Calculate the progress in percent.
  auto remains = file.bytesAvailable();
  auto progress = ((size - remains) * 100) / size;
  printf("progress: %d%%\r", progress);
}

【讨论】:

  • 谢谢你。这正是我认为正确的方式。基于文件大小而不是行数,而行的结构是相同的。这对我来说是一个非常好的解决方案,只是为了让用户了解在此过程中是如何完成负载的。
  • @vahancho,完美解决了一个有效的问题!不过有一条评论 :) 关于代码 scale,它本身非常小.. 我无法忍受每次迭代都调用 file.bytesAvailable() .. 我想更好地在循环之前调用它,然后提取处理的每一行的大小。
  • @MohammadKanan,感谢您的评论。 WRT 你的提议,你仍然需要在每次迭代中调用一个函数。此外,仅获得行的大小是不够的 - 您需要在减法之前将其转换为字节。我认为您不会通过这种方法获得任何收益。
  • @vahancho,很好,每次迭代都必须调用函数.. 但是如果文件足够大bytesAvailable() 可能涉及每次迭代的磁盘读取?
  • @MohammadKanan,嗯,很好,但是如果你看一下QIODevice::bytesAvailable() 的实现,你会注意到它的时间复杂度是恒定的,而且看起来很快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
  • 2015-08-06
  • 2016-04-22
  • 1970-01-01
相关资源
最近更新 更多