在Visual Studio中EOF之前的EOF
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
仍然有字节供您读取。在 read操作之后使用feof()
来确定是否处于文件的末尾,如果将操作FILE*
的函数与操作整型文件描述符的函数混合使用,请小心。
如果文件I/O操作在包装它的file流上,则不应该直接在描述符上使用_eof()。在应用程序从FILE流中读取所有数据之前,发生了缓冲,底层描述符将到达文件结束。
在本例中,ftell(fp)报告流的状态,您应该使用ftell(fp)将它们保持在相同的I/O域中。
相关文章:
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- 如何确定我已使用非编码文件到达 EOF?
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 试图在visual studio上用C++创建一个桌面应用程序
- 如何在MS Visual Studio 2019中运行QT UI
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- Visual Studio Code - C++ Debugger 無法啟動
- Visual C++ constexpr Hints
- 为什么它不适用于Visual 2019的原因
- Visual Studio 2019:插入多个C++风格的单行注释
- Visual Studio Code "undefined reference to `WinMain@16'"
- visual在c++中将十进制数转换为二进制数
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- Visual Studio中的函数声明和函数定义问题
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- Visual C++(VS2017)中用户定义的转换不明确
- Visual C++GC接口如何启用它以及要包含哪个库
- visual是否可以在c++中创建一个接收无限数量相同类型(或至少相当数量)参数的函数
- Visual c++, std和getline(ifstream, string), EOF在std栈内抛出和中断,这正
- 在Visual Studio中EOF之前的EOF