首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Visual Studio中EOF之前的EOF

Visual Studio中EOF之前的EOF
EN

Stack Overflow用户
提问于 2011-09-02 10:23:45
回答 2查看 606关注 0票数 0

我在一个程序中(在Visual 2005中)获得了这个片段:

代码语言:javascript
复制
if(_eof(fp->_file))
{
    break;
}

当到达eof时,它打破了封闭的循环。但是该程序无法解析文件中最后几千个字符。所以,为了弄清楚发生了什么,我做了这样的事情:

代码语言:javascript
复制
if(_eof(fp->_file))
{
    cout<<ftell(fp)<<endl;
    break;
}

现在,我从file得到的答案与实际的文件大小不同(而且更小)(这不是预期的)。我认为Windows可能对文件有一些问题,然后我做了如下操作:

代码语言:javascript
复制
if(_eof(fp->_file))
{
    cout<<ftell(fp)<<endl;
    fseek(fp, 0 , SEEK_END);
    cout<<ftell(fp)<<endl;
    break;
}

嗯,failed ()给出了正确的答案(等于文件大小),而初始的ftell()失败了(如前所述)。

知道这里可能出了什么问题吗?

编辑:文件是以"rb“模式打开的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-02 10:41:20

您无法在从_eof()获得的文件描述符上可靠地使用FILE*,因为FILE*流是缓冲的。这意味着fp已经将fp->_file删除,并将剩余的字节存储在其内部缓冲区中。最终,fp->_file处于eof位置,而fp仍然有字节可供您读取。在读取操作之后使用feof()来确定您是否位于文件的末尾,如果您将在FILE*上操作的函数与在整数文件描述符上操作的函数混合起来,则要小心。

票数 3
EN

Stack Overflow用户

发布于 2011-09-02 10:46:36

如果您的文件I/O操作位于包装它的文件流上,则不应该在描述符上直接使用_eof()。在应用程序读取文件流中的所有数据之前,会发生缓冲,并且底层描述符将到达文件末尾。

在这种情况下,ftell(fp)报告流的状态,您应该使用feof(fp)将它们保持在相同的I/O域中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7282127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档