因此,我在许多需要文件输入的程序中使用了eof()
函数,我的教授说这样做没问题,但是一些SO上的人说我不应该使用它,而没有具体说明原因。所以我想知道,有没有好的理由?
因此,我在许多需要文件输入的程序中使用了eof()
函数,我的教授说这样做没问题,但是一些SO上的人说我不应该使用它,而没有具体说明原因。所以我想知道,有没有好的理由?
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";
}
}
eof()
并不意味着“文件位置在结尾,下一次读取将失败”。它的意思是“你试图读取超出文件结尾的内容,而这个操作失败了”。 - Erikwhile (!eof()) { cin >> foo; }
循环中,你并不是读取 直到 文件结束。你是读取直到文件结束 再多读一次。而且你没有测试其他可能导致读取失败的方式。 - Erikint foo; while (!cin.eof()) { cin >> foo; cout << foo << "\n" }
。这是一个典型的结构,它并不能完成程序员预期的功能。它最多只能读取所有整数并将它们显示出来,然后再显示最后一个整数一次。如果你输入 "1 2 abc",它将读取和显示 "1"、"2",然后无限循环地显示 "2"。 - Erik如果输入失败的原因不同,你就会遇到麻烦,所以不应该使用它。
while(!file.eof()) {
int i;
file >> i;
doSomething(i);
}
如果文件的内容是"WHAARRRRRRGARBL",那么在上述循环中会发生什么?它将无限循环,因为它不是文件结尾,但您仍然无法从其中提取一个整数。
cin >> somedouble >> someint >> somechar;
有什么意义呢? - Drise你是如何使用它的? .eof()
会告诉你流已经到达了文件末尾,试图读取不存在的数据。
通常情况下,这不是你想要的。通常,你想知道是否正在接近文件末尾,而不是已经到达了文件末尾。在像这样的循环中:
while(!f.eof())
{
f >> /* something */;
/* do stuff */
}
/* do stuff */
中的所有内容,然后循环条件失败并停止循环。该循环的另一个问题是,输入可能会以其他方式失败。如果文件存在错误条件但不是 EOF,则 .fail()
将返回 true
,但 .eof()
不会。.eof()
函数或任何其他类似的函数。然而,如果在读取文件时出现系统错误,您可能也希望停止。 - David Thornley
feof()
函数吗? - Oliver Charlesworth