首页 >后端开发 >C++ >在 C 中读取文件流时如何正确测试文件结尾?

在 C 中读取文件流时如何正确测试文件结尾?

Linda Hamilton
Linda Hamilton原创
2024-12-21 15:33:10757浏览

How to Correctly Test for End-of-File When Reading from a File Stream in C  ?

测试流输入状态与未来的成功

使用流读取输入时,了解测试流状态和预测之间的区别至关重要未来运营的成功。

问题:阅读最后一行两次

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn