[英]EOF before EOF in Visual Studio
我在程序中(在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”模式下打开。
您不能在从FILE*
获得的文件描述符上可靠地使用_eof()
,因为FILE*
流已缓冲。 这意味着fp
已将fp->_file
吸干,并将剩余字节存储在其内部缓冲区中。 最终fp->_file
在eof位置,而fp
仍有字节供您读取。 在读取操作之后使用feof()
来确定您是否位于文件末尾,并且如果将在FILE*
上运行的函数与在整数文件描述符上运行的函数混合使用,请务必小心。
如果您的文件I / O操作位于包装它的FILE流上,则不应直接在描述符上使用_eof()。 发生了缓冲,并且在应用程序从FILE流读取所有数据之前,基础描述符将到达文件末尾。
在这种情况下,ftell(fp)报告了流的状态,您应该使用feof(fp)将它们保持在相同的I / O域中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.