eof()不良做法

eof() bad practice?

本文关键字:不良 eof      更新时间:2023-10-16

可能重复:
为什么循环条件中的iostream::eof被认为是错误的?

所以我在很多需要文件输入的程序中都使用了eof()函数,我的教授说使用它很好,但So上的一些人说,在没有具体说明原因的情况下,我不应该使用它。所以我想知道,有充分的理由吗?

您可以使用eof来测试它报告的确切条件-您是否试图读取文件末尾。您不能使用它来测试是否有更多的输入要读取,或者读取是否成功,这是更常见的测试。

错误:

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

正确:

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

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

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

如果文件的内容是"WHAARRRRRGARBL",那么在上面的循环中会发生什么?它无限循环,因为它不是文件的末尾,但您仍然无法从中提取int

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

这通常不是你想要的。通常,你想知道你正在达到文件的末尾,或者你即将达到文件的结尾,而不是你已经达到了

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

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

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

如果以上答案令人困惑:

人们认为它做的是错误的:

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

它的实际作用:

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

如果eof((为真,则表示您已经犯了一个错误。教授们的陈述就是这样解释的。使用它的意思是,发生了错误。