eof()不好的做法?

时间:2011-04-29 21:35:36

标签: c++ eof

  

可能重复:
  Why is iostream::eof inside a loop condition considered wrong?

所以我在很多需要文件输入的程序中一直使用eof()函数,而我的教授说使用它很好,但SO上的一些人说我不应该使用它而不真正指定原因。所以我想知道,有充分的理由吗?

4 个答案:

答案 0 :(得分:32)

您可以使用eof来测试其报告的确切条件 - 无论您是否已尝试阅读过去的文件结尾。您无法使用它来测试是否有更多的输入要读取,或者读取是否成功,这是更常见的测试。

错:

while (!cin.eof()) {
  cin >> foo;
}

正确:

if (!(cin >> foo)) {
  if (cin.eof()) {
    cout << "read failed due to EOF\n";
  } else {
    cout << "read failed due to something other than EOF\n";
  }
}

答案 1 :(得分:12)

你不应该使用它,因为如果由于其他原因输入失败,你可能会被搞砸。

while(!file.eof()) {
    int i;
    file >> i;
    doSomething(i);
}

如果文件内容为“WHAARRRRRRGARBL”,上述循环会发生什么?它无限循环,因为它不是文件的结尾,但你仍然无法从中提取int。

答案 2 :(得分:3)

你是如何使用它的? .eof()将告诉您的是,流已经到达文件末尾,它已尝试读取不存在的数据。

这通常不是你想要的。通常,你想要知道你正在命中文件的末尾,或者你想要到达文件的末尾,而不是你已经命中了它。在像这样的循环中:

while(!f.eof())
{
    f >> /* something */;
    /* do stuff */
}

你将尝试读取输入和失败,然后你将执行/* do stuff */中的所有内容,然后循环条件失败并且循环停止。

该循环的另一个问题是输入可能会失败的其他方式。如果文件中的错误条件不是EOF,.fail()将返回true,但.eof()则不会。

答案 3 :(得分:3)

如果上述答案令人困惑:

人们认为它的作用是错误的:

  • eof()不会查看您读取的最后一部分是否包含文件的最后一个字节。
  • 它不会查看下一个字节是否在文件结尾之后。

它实际上做了什么:

  • eof()报告最后一次读取是否包含超过文件末尾的字节。

如果eof()为真,那你就错了。因此解释了教授的说法。使用它意味着什么,发生了错误。