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

C++ Qt QFile::size()始终返回0,c++,qt,size,qfile,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() << "Siz

我正在编写一个应用程序,其中我多次调用
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;
}
while(!in.atEnd())
{
if(fileOut.size()!=0)//未执行此“if”。(如果我将!=更改为==它始终返回0)
{

out我假设您正在使用某个拖缆来写入文件。问题是拖缆缓冲数据,而不是立即写入文件(通常要等到缓冲区达到一定大小才能写入)

不可能反映正确的大小,因为它不考虑数据仍然在缓冲区中,但没有刷新到文件。

如果您使用拖缆,您将拥有正确的大小和光标位置:

#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;
}
#包括
#包括
#包括
int main(int argc,char*argv[])
{
QFile f(“example.txt”);

qDebug()我假设您正在使用一些拖缆来写入文件。问题是拖缆缓冲数据,而不是立即写入文件(通常会等到缓冲区达到一定大小后再写入)

不可能反映正确的大小,因为它不考虑数据仍然在缓冲区中,但没有刷新到文件。

如果您使用拖缆,您将拥有正确的大小和光标位置:

#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;
}
#包括
#包括
#包括
int main(int argc,char*argv[])
{
QFile f(“example.txt”);


qDebug()在打开后修改的打开文件上假设文件大小正确是不可移植的。即使您可以“让它工作”,这仍然是错误的做法。当您打开文件时,您可以检查文件的大小,然后您自己的代码必须跟踪文件大小的变化。当然,您可以使用Qt为您进行跟踪,但只有通过
QFileDevice
(即
QFile
QSaveFile
)。

假设在打开后修改的打开文件上的文件大小正确是不可移植的。即使您可以“使其工作”,这仍然是错误的做法。当您打开文件时,您可以检查文件的大小,然后您自己的代码必须跟踪文件大小的变化。当然,您可以使用Qt为您进行跟踪,但只有通过
QFileDevice
(即
QFile
QSaveFile
)。

在我的例子中,问题在flag中。
QIODevice::readOnly
并不总是返回正确的大小(总是0)。更改为
QIODevice::readOnly
解决了问题。

在我的例子中,问题在flag中。
QIODevice::readOnly
并不总是返回正确的大小(始终为0)。更改为
QIODevice::readOnly解决了此问题。

在打开之前测量文件大小您是否认为文件可能根本不存在?我在调用size()之前打开文件。是的,它存在(我调用了exists()方法).Create
QFile
,将大小存储在int中,然后打开它。出于某种原因,打开的文件报告大小为0。并且IO流总是报告0,即使是位置,这听起来像是一个bug。好的,我会尝试一下,但为什么它会在其他地方运行?(就像我作为示例显示的那样)我只想检查文件是否为空。在打开文件之前先确定文件大小。您是否认为该文件可能根本不存在?我在调用size()之前打开文件。是的,它存在(我调用了exists()方法).Create
QFile
,将大小存储在int中,然后打开它。出于某种原因,打开的文件报告大小为0。并且IO流总是报告0,即使是位置,这听起来像是一个bug。好的,我会尝试一下,但为什么它会在其他地方运行?(就像我作为示例显示的那样)我只想检查文件是否为空。好的,它现在可以工作了,但我感兴趣的是bufor释放存储数据时的大小是多少?我在哪里可以找到这样的信息?一旦刷新流,文件包含所有写入的数据,所以只需使用
QFile::size
我知道。我只是好奇必须有多少数据tored to release,因为在我代码的某些部分,
QFile::size
工作正常。无论如何,谢谢!哦,对不起,我不明白你的问题:
QTEXTSTREAM\u BUFFERSIZE
默认为16KB;好的,现在可以工作了,但我想知道bufor发布存储数据时的大小是多少?我在哪里可以找到信息这样吗?一旦你刷新了流,文件就包含了所有的写入数据,所以只需使用
QFile::size
我知道。我只是好奇要释放多少数据,因为在我的代码的某些部分,
QFile::size
工作正常。无论如何,谢谢!哦,对不起,我不明白你的问题:
QTEXTSTREAM\u BUFFERSIZE
默认为16KB;看起来您的答案可能需要更多的细节,您说过更改为相同的东西解决了问题?看起来您的答案可能需要更多的细节,您说过更改为相同的东西解决了问题?