eof()不好的做法?

Sam*_*Sam 25 c++ eof

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

所以我使用过eof()的功能在我的很多程序,需要文件输入的,我的教授说,这是蛮好用的,但有几个人在等纷纷表示,我不应该没有真正指定的原因使用它.所以我想知道,有充分的理由吗?

Eri*_*rik 34

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

错误:

while (!cin.eof()) {
  cin >> foo;
}
Run Code Online (Sandbox Code Playgroud)

正确:

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

  • @Sam:`int foo; while(!cin.eof()){cin >> foo; cout << foo <<"\n"}`.这是一个典型的构造,它不能完成程序员的意图.它将*不*读取所有整数并再次显示它们,它将*最多*读取所有整数并显示它们,然后再次显示最后一个.如果你输入例如"1 2 abc"作为输入,它将读取并显示"1","2",然后循环显示"2"一遍又一遍. (6认同)
  • @Sam:`eof()`并不意味着"文件位置结束而下一次读取将失败".这意味着"你试图读取*超出*文件结尾但失败的东西" (4认同)

Pup*_*ppy 12

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

while(!file.eof()) {
    int i;
    file >> i;
    doSomething(i);
}
Run Code Online (Sandbox Code Playgroud)

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