“eof”是否为“ifstream”的有效状态
Is `eof`` a valid state of `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
的有效状态吗
这是因为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!
相关文章:
- 欧拉项目#8答案是大以获得有效答案
- ifstream什么都没读
- 调整大小后指向元素值的指针unordered_map有效?
- 为什么是0;C++中的有效语句
- 最高有效数字侧的第N位
- GCC对可能有效的代码抛出init list生存期警告
- 有效地使用std::unordered_map来插入或增加键的值
- c++中O(n^(1/3))中一个数的除数的有效计数
- 狂想曲C++状态图 - 事件(似乎有效)与触发操作(似乎什么都不做)
- 严重性代码说明项目文件行抑制状态错误 C2676 二进制">>":"std::ifstream"
- 在某些范围更新后获取整数数组的最终状态的有效算法是什么?
- 为什么while(std::ifstream >> s)有效?
- 仅当对象处于特定状态时,操作才有效
- 如何复制ifstream的状态
- “eof”是否为“ifstream”的有效状态
- 状态检查总是一件有效的事情吗
- 从ifstream读到stringstream的有效方法
- 在c++中重置ifstream对象的文件结束状态
- 在一个函数中使用有效的 setter 进行更改会在另一个函数中重置回其旧状态
- c++对象是否总是处于有效状态?