No `while (!my_ifstream.eof()) { getline(my_ifstream, line)

No `while (!my_ifstream.eof()) { getline(my_ifstream, line) }` in C++?

本文关键字:my ifstream getline line No while eof      更新时间:2023-10-16

在这个网站上,有人写道:

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

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

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

为什么会这样?

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

然而,即使没有其他故障,第一个也不能正常工作。eof()不会被设置,直到读取尝试失败,因为到达了文件的末尾。这意味着第一个循环将执行一个您并不真正想要的额外迭代。在本例中,这只会在文件末尾添加额外的空白(空)行。这取决于你在做什么,可能重要,也可能不重要。根据您用来读取数据的方式,在输出中重复最后一行也是相当常见的。

流操作(如读取)可能由于多种原因而失败。eof()只测试其中一个。要测试它们,只需使用流的void *转换操作符。这就是在第二个代码片段中所做的。