我在程序中使用了这个代码段(在Visual Studio 2005中):
if(_eof(fp->_file))
{
break;
}
当达到eof时,它打破了封闭的循环。但该程序无法解析文件中最后几千个字符。所以,为了弄清楚发生了什么,我这样做了:
if(_eof(fp->_file))
{
cout<<ftell(fp)<<endl;
break;
}
现在我从ftell得到的答案与实际文件大小(不是预期的)不同(和更小)。我认为Windows可能对文件有一些问题,然后我这样做了:
if(_eof(fp->_file))
{
cout<<ftell(fp)<<endl;
fseek(fp, 0 , SEEK_END);
cout<<ftell(fp)<<endl;
break;
}
好吧,fseek()给出正确答案(等于文件大小),初始ftell()失败(如前所述)。
关于这里可能出现什么问题的任何想法?
编辑:该文件以“rb”模式打开。
答案 0 :(得分:3)
您无法在从_eof()
获取的文件描述符上可靠地使用FILE*
,因为FILE*
流是缓冲的。这意味着fp
已将fp->_file
吸干并将剩余字节存储在其内部缓冲区中。最终fp->_file
位于eof位置,而fp
仍有字节供您阅读。在读取操作之后使用feof()
来确定您是否在文件的末尾,并且如果将在FILE*
上运行的函数与在整数文件描述符上运行的函数混合使用时要小心
答案 1 :(得分:1)
如果文件I / O操作位于包装它的FILE流上,则不应直接在描述符上使用_eof()。在应用程序读取FILE流中的所有数据之前,会发生缓冲并且底层描述符将命中文件结尾。
在这种情况下,ftell(fp)报告流的状态,您应该使用feof(fp)将它们保存在同一个I / O域中。