在C ++中没有`while(!my_ifstream.eof()){getline(my_ifstream,line)}`

时间:2011-10-02 01:11:31

标签: c++ ifstream getline

this website,有人写道:

  
while (! myfile.eof() )
{
   getline (myfile,line);
   cout << line << endl;
}
  
     

这是错误的,请仔细阅读eof()的文档   memberfunction。正确的代码是:

while( getline( myfile, line))
    cout << line << endl;

为什么会这样?

2 个答案:

答案 0 :(得分:8)

主要有两个原因。 @Etienne已经指出:读取可能由于某种原因而失败,而不是到达文件的末尾,在这种情况下,您的第一个版本将进入无限循环。

然而,即使没有其他失败,第一个也无法正常工作。 之后,尝试读取失败后才会设置eof(),因为文件末尾已到达。这意味着第一个循环将执行一个您不想要的额外迭代。在这种情况下,这将最终在文件末尾添加一个额外的空白(空)行。取决于您正在使用的内容,这可能或不重要。根据您用于读取数据的内容,在输出中重复查看最后一行也很常见。

答案 1 :(得分:3)

流操作(例如读取)可能由于多种原因而失败。 eof()只测试其中一个。要全部测试,只需使用流的void *转换运算符即可。这就是第二个片段中的内容。