测试流输入状态与未来的成功
使用流读取输入时,了解测试流状态和预测之间的区别至关重要未来运营的成功。
问题:阅读最后一行两次
ifstream f("x.txt"); string line; while (f.good()) { getline(f, line); // Use line here. }
在此代码中,最后一行被读取两次,因为 f.good() 测试当前流状态,而不是 getline() 是否成功。一旦 getline() 到达 EOF,f 仍处于“良好”状态,因此即使在读取最后一行后,循环仍会继续。
解决方案:操作后测试流
相反,在执行输入操作后检查流状态:
ifstream f("x.txt"); string line; while (getline(f, line)) { // Use line here. }
替代使用eof()
虽然不建议在循环条件中使用 eof(),但这里有一个使用 !f.eof() 的等效解决方案:
ifstream f("x.txt"); string line; while (!f.eof()) { if (getline(f, line)) { // Use line here. } else { break; } }
范围-基于所有行的循环
要读取和处理所有行,请使用基于范围的循环:
ifstream f("x.txt"); for (std::string line; getline(f, line);) { process(line); }
Good 与 Stream State
请注意,f.good() 命名错误。它并不真正指示流的“良好”,而是当流不处于“失败”或“不良”状态时返回 true。在执行输入操作后始终测试流本身(即检查其反转的失败状态)以确保成功。
以上是在 C 中读取文件流时如何正确测试文件结尾?的详细内容。更多信息请关注PHP中文网其他相关文章!