Qt QFile :: size()始终返回0

时间:2018-06-03 17:46:19

标签: c++ qt size qfile

我正在编写一个应用程序,我很多次调用QFile::size()方法。它适用于除一个地方外的所有地方。我将展示那个地方和一个可供比较的地方。

哪些不起作用:

while(!in.atEnd())
{
    if (fileOut.size() != 0) //This "if" isn't executed. (if I change != to == it always returns 0)
    {
      out<<endl;
      qDebug() << "Size of fileOut: " << fileOut.size(); 
    }

    QString temp;
    temp = in.readLine();
    out<<temp;
}

工作:

if(fileOut.size() != 0) 
{
  out<<endl;
}

QString temp = in.readLine();
out<<temp<<endl;

temp = in.readLine();
out<<temp;

while(temp[temp.length()-1] != ']')
{
    temp = in.readLine();
    out<<temp;
}

我一直在寻找解决办法,但我已经尝试了所有这些方法来解决这个问题。

修改/解决:    为了清楚起见,一切都围绕着buffor,但是,在对文档进行细微分析之后,我可以解释为什么只有这段代码没有返回QFile::size()的正确值而不是全部(没有一个)没有达到缓冲区自动释放数据的大小)。在所有这些地方,endl被使用了,正如文档所说: 将'\ n'写入流并刷新流。 所以现在一切都很清楚了。在所有其他地方,flush()方法被调用,但我不知道它。如此短暂的修正。    问题解决了,你需要做的就是调用flush()。

3 个答案:

答案 0 :(得分:3)

我假设您正在使用一些流媒体来编写您的文件。问题是流式传输器缓冲数据,它不会立即写入文件(它通常会等到缓冲区达到一定大小才能写下来)。

QFile::pos可能也没有反映正确的大小,因为它不会将数据视为仍在缓冲区中但不会刷新到文件中。

如果你{4}}你的流光线,你将拥有正确的尺寸和光标位置:

#include <qdebug.h>
#include <qfile.h>
#include <qtextstream.h>

int main(int argc, char* argv[])
{
  QFile f("example.txt");
  qDebug() << "f.size() before opening =" << f.size(); // correct

  if (!f.open(QFile::WriteOnly)) {
    qDebug() << "Error: not opened!";
    return 1;
  }    

  QTextStream out(&f);
  qDebug() << "f.size() before writing =" << f.size(); // 0: file was overwritten

  out << "Hello world!\n";
  qDebug() << "f.size() after writing =" << f.size(); // may be incorrect
  qDebug() << "f.pos() after writing =" << f.pos(); // may be incorrect

  out.flush();
  qDebug() << "f.size() after flushing =" << f.size(); // correct

  f.close();
  qDebug() << "f.size() after closing =" << f.size(); // correct

  return 0;
}

下一个例子显示了一个更糟糕的情况,当你可能有一个非零的大小,但是没有反映出正确的大小:

#include <qdebug.h>
#include <qfile.h>
#include <qtextstream.h>

int main(int argc, char* argv[])
{
  QFile f("example.txt");

  if (!f.open(QFile::WriteOnly)) return 1;

  QTextStream out(&f);

  for (int i = 0; i < 10000; ++i) { // 10000 works for me, may be you have to increase it to see the partial write
    out << "Hello world!\n";
  }
  qDebug() << "f.size() after writing =" << f.size(); // may be incorrect
  qDebug() << "f.pos() after writing =" << f.pos(); // may be incorrect

  out.flush();
  qDebug() << "f.size() after flushing =" << f.size(); // correct

  f.close();

  return 0;
}

这是由于上面提到的事实:缓冲区在某些时候被刷新,但仍有一些数据需要写入。

再次,确保在检查大小之前刷新您的流。

更新代码flush()

答案 1 :(得分:2)

It is not portable to assume that file size is correct on open files that have been modified after the open. Even if you can "get it to work", it's still the wrong thing to do. When you have opened the file, you can check how big it is, and then your own code has to track how it has changed the size. You could of course patch Qt to do this tracking for you, but it'd work only as long as the file is accessed through the QFileDevice (i.e. QFile or QSaveFile).

答案 2 :(得分:1)

就我而言,问题出在问题上。 QIODevice::readOnly并非总是返回正确的大小(总是为0)。更改为QIODevice::readOnly可以解决问题。