“eof”是否为“ifstream”的有效状态

Is `eof`` a valid state of `ifstream`?

本文关键字:有效状态 ifstream 是否 eof      更新时间:2023-10-16

代码为:

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()时,输出是正确的eofifstream的有效状态吗

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

你应该做例如

while (std::getline(...))
{
    // ...
}

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

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

while (getline(fin, line)) {
    cout << line << endl;
}

的用法

while(fin)

不好。它将检查鳍的值,而不是鳍是否到达终点。

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

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

getline(fin,line);

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

line

所以它也会打印

hi, I am Jack!