`eof``是`ifstream`的有效状态吗?

时间:2013-07-29 08:23:53

标签: c++ fstream ifstream

代码是:

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吗?

3 个答案:

答案 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!