c++ - Visual Studio 中 EOF 之前的 EOF

标签 c++ visual-studio file-io

我在一个程序中有这个片段(在 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/

相关文章:

c# - 使用 com 可调用包装器将结构数组从 C# 传递到 C++

c++ - 每次制作都会创建预编译头?

c++ - 库函数需要一个 std::function<void(void)>,我如何传入一个类函数?

c++ - 如何使随机数(50 毫秒以下)不会重复两次

c# - 这些获取 DTE2 的方法有什么区别(Visual Studio 2013)

java - 从 Spring Controller 获取 Web App 根目录

Java 可运行文件 IO

visual-studio - 如何调试流畅的 API?

c# - 在另一个仍然打开的窗体上调用方法?

python - 使用 Python 将 CSV 读/写为二进制文件