C++ 坏习惯?

C++ 坏习惯?,c++,eof,C++,Eof,可能重复: 所以我在很多需要文件输入的程序中使用了eof()函数,我的教授说可以使用,但有一些人说,如果没有具体说明原因,我不应该使用它。所以我想知道,有什么好的理由吗?您可以使用eof来测试它报告的确切情况-您是否尝试读取超过文件结尾的内容。您不能使用它来测试是否有更多的输入要读取,或者读取是否成功,这是更常见的测试 错: while (!cin.eof()) { cin >> foo; } 正确: if (!(cin >> foo)) { if (cin.

可能重复:


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

您可以使用
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";
  }
}
if(!(cin>>foo)){
if(cin.eof()){

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

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

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

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

这通常不是您想要的。通常,您希望知道您正在到达文件的结尾,或者您即将到达文件的结尾,而不是您已经到达了它。在如下循环中:

while(!f.eof())
{
    f >> /* something */;
    /* do stuff */
}
您将尝试读取输入并失败,然后执行
/*do stuff*/
中的所有操作,然后循环条件失败,循环停止


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

如果上述答案令人困惑:

人们认为这是错误的:

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

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

如果eof()为真,则表示您已经犯了错误。professors语句就是这样解释的。使用它意味着发生了错误。

我认为您是指
feof()
函数?他可能指的是iostream::eof()函数。但是如果您已经阅读了文件的末尾,是否应该没有剩余信息?@Sam:
eof()
并不意味着“文件位置已结束,下次读取将失败”。它意味着“您试图读取文件末尾以外的内容,但失败了”我想我理解你的意思,但是读过文件末尾会有什么伤害?你不会仍然提取所有的数据吗?或者你是说有时你不想要所有的数据吗?或者..@Sam:重点是在
中,(!eof()){cin>>foo;}
循环直到文件结束才读取。直到文件结束再读取一次。并且您没有测试读取失败的其他方式。@Sam:
int foo;while(!cin.eof()){cin>>foo;不能只是大声地思考,但是你不能把它放在一个字符串中,然后对它进行操作吗?或者这是低效的?低效的,使用格式化输入,比如
cin>>somedouble>>someint>>somechar;
,有什么意义呢?那么你是说这是因为我的变量或者我选择的任何东西来保存中的数据不适用于该类型?我不确定为什么这对我来说如此混乱。@山姆:读取错误的数据是可能的,但您必须单独处理。它不会触发
.eof()<或代码>函数或类似的任何其他。但是,如果读取文件的系统错误,您可能还想停止。读取文件的结尾不是错误,而是非常正常的操作。例如,考虑ItestING SW(“123”);int i;s>i;现在S.EOF()是真的(因为读取必须查看如果有第四位),则Ss FAILE()是错误的。(因为读取成功)和i包含值123。