流状态管理:避免重复读取最后一行
使用 ifstream 从文件读取时,正确管理流状态至关重要以避免意外行为,例如将最后一行读两次。
为什么要双读发生
在循环条件中使用 f.good() 或 !f.eof() 会导致最后一行被读取两次。这是因为:
文件末尾可能存在不完整或格式错误的行,导致 getline 失败。如果在循环条件中使用 f.good() 或 !f.eof(),即使 getline 失败,循环也会继续,导致重新读取最后一个有效行。
正确的流状态管理
为了避免此问题,应在执行所需的输入操作后检查流状态。这可以使用以下技术来完成:
getline 之后:
if (getline(stream, line)) { use(line); } else { handle_error(); }
之后运算符>>:
if (stream >> foo >> bar) { use(foo, bar); } else { handle_error(); }
要读取和处理所有行,建议使用以下循环构造:
for (std::string line; getline(stream, line);) { process(line); }
此循环自动终止当 getline 无法读取另一行时。
注意事项good()
good() 函数的命名可能会产生误导。它仅表明到目前为止没有遇到错误,但并不意味着下一步操作会成功。因此,一般不建议使用good()来预测未来输入操作的结果。
以上是在 C 中使用 ifstream 时如何避免重复读取最后一行?的详细内容。更多信息请关注PHP中文网其他相关文章!