我在一个程序中有这个片段(在 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”模式打开。
最佳答案
你不能可靠地使用 _eof()
在从 FILE*
获得的文件描述符上,因为 FILE*
流被缓冲。这意味着 fp
吸了fp->_file
干燥并将剩余的字节存储在其内部缓冲区中。最终fp->_file
在eof位置,而fp
仍然有字节供您阅读。使用 feof()
在 读取操作之后确定您是否在文件的末尾,如果您混合对 FILE*
操作的函数,请小心那些对整数文件描述符进行操作的。
关于c++ - Visual Studio 中 EOF 之前的 EOF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7282127/