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()方法).CreateQFile
,将大小存储在int中,然后打开它。出于某种原因,打开的文件报告大小为0。并且IO流总是报告0,即使是位置,这听起来像是一个bug。好的,我会尝试一下,但为什么它会在其他地方运行?(就像我作为示例显示的那样)我只想检查文件是否为空。在打开文件之前先确定文件大小。您是否认为该文件可能根本不存在?我在调用size()之前打开文件。是的,它存在(我调用了exists()方法).CreateQFile
,将大小存储在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;看起来您的答案可能需要更多的细节,您说过更改为相同的东西解决了问题?看起来您的答案可能需要更多的细节,您说过更改为相同的东西解决了问题?