如何在处理之前报告进度而不通过整个文件

时间:2018-01-25 14:24:03

标签: qt qfile

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

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

或者在处理之前是否有更简单的方法来获取记录数而不通过整个文件?

我的代码段:

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 ++函数

1 个答案:

答案 0 :(得分:4)

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

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);
}