在Visual Studio中EOF之前的EOF

时间:2011-09-02 10:23:45

标签: 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”模式打开。

2 个答案:

答案 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域中。