代码是:
ifstream fin("D://abc.txt", ios::in);
string line;
while ( fin ) {
getline( fin, line );
cout << line << endl;
}
文本文件是:
hi, I am Eric!
hi, I am Jack!
输出
hi, I am Eric!
hi, I am Jack!
hi, I am Jack!
当我将条件更改为!fin.eof()
时,输出是正确的。 eof
的有效状态是ifstream
吗?
答案 0 :(得分:4)
这是因为在 std::getline
函数失败后之前状态才会改变。这意味着您正确读取了前两行,但状态未更改,因此您再次进入循环,但现在std::getline
调用失败但您没有检查它,现在也设置了eof
标志。
你应该这样做。
while (std::getline(...))
{
// ...
}
答案 1 :(得分:3)
只有在您尝试阅读过去流的结尾时才会显示eof
州。从文件中读取最后一行的getline
调用不会这样做(它会在换行符之前读取)。但是循环的下一次迭代中的getline
调用将到达文件的末尾。
读取文件中每一行的更好方法是:
while (getline(fin, line)) {
cout << line << endl;
}
答案 2 :(得分:1)
用法
while(fin)
不好。它将检查fin的值,而不是fin是否到达终点。
您可以查看此页面: http://www.cplusplus.com/reference/string/string/getline/
当你完成函数getline的第二次调用时,指针fin不指向NULL,所以你进入第三个进程while,第三次调用
getline(fin,line);
它满足了鳍的eof,所以fin改变了状态,那么你就不会去第四个电话,但是因为你没有清楚它的价值
line
所以它也会打印
hi, I am Jack!