我最近遇到了一个由使用 fstream::eof() 引起的问题。我从这里读到以下行:
如果已到达相关输入文件的末尾,则函数 eof() 返回 true,否则返回 false。
并且(错误地)假设这意味着如果我使用 fstream::read() 并读取文件末尾,函数 eof() 会告诉我。所以我做了这样的事情(非常笼统):
for(int i = 0; i < max && !file.eof(); i++)
{
file.read(mything, sizeof(mything));
}
问题的出现是因为稍后在上面链接的页面上解释的内容(由于第一段的误导,我最初没有阅读):
相反,如果在最后一个标记之后碰巧有任何空格,则流不会进入 EOF 状态,但尝试读取另一个标记仍然会失败。因此,EOF 标志不能用作循环中的测试,该循环旨在读取所有流内容,直到 EOF。相反,应该在尝试读取后检查失败情况。
所以我改变了,现在我的循环检查 file.fail() 而不是 file.eof(),我了解 eof() 是如何工作的。我的问题是,为什么它会这样工作?是否存在需要这样做的情况?在我看来,一旦你通过了 EOF,你就通过了 EOF,并且 eof() 应该返回 true。
更新 感谢您的回复,我想我明白了。我正在执行的唯一操作是read(),我立即检查fail(),所以我认为我没问题。现在,我的问题是,我将使用 eof() 做什么?