2

The code is:

ifstream fin("D://abc.txt", ios::in);
string line;
while ( fin ) {
    getline( fin, line );
    cout << line << endl;
}

The text file is:

hi, I am Eric!
hi, I am Jack!

And the output is

hi, I am Eric!
hi, I am Jack!
hi, I am Jack!

And when I change the condition to !fin.eof(), output is correct. Is eof a valid state of ifstream ?

4

3 回答 3

4

这是因为直到函数失败状态才会改变。std::getline这意味着您正确阅读了前两行,但是状态没有更改,因此您再次进入循环,但是现在std::getline调用失败但您没有检查它,而且现在也eof设置了标志。

你应该做例如

while (std::getline(...))
{
    // ...
}
于 2013-07-29T08:27:01.203 回答
3

仅当您尝试读取超过流的末尾时eof才会达到该状态。从文件中读取最后一行的调用不会这样做(它会一直读取到换行符)。但是循环的下一次迭代中的调用将到达文件的末尾。getlinegetline

读取文件中每一行的更好方法是:

while (getline(fin, line)) {
    cout << line << endl;
}
于 2013-07-29T08:28:04.533 回答
1

用途

while(fin)

不好。它将检查 fin 的值,而不是 fin 是否到达末尾。

您可以查看此页面: http ://www.cplusplus.com/reference/string/string/getline/

当你完成第二次调用getline函数时,指针fin不指向NULL,所以你在while中进入第三个进程,第三次调用

getline(fin,line);

它满足 fin 的 eof,所以 fin 改变状态,那么你不会去第四次调用,但是由于你没有清除 value

line

所以它也会打印

hi, I am Jack!
于 2013-07-29T08:37:45.713 回答