测试流条件:为什么使用 good() 或 !eof() 读取最后一行两次
尝试读取文本文件时使用 ifstream 逐行,在循环中使用 f.good() 或 !f.eof() 可能会导致最后一行读取两次。让我们深入研究这种行为背后的原因并探索替代解决方案。
了解流状态函数
good()、eof() 和 failed() 是流状态指示输入流当前状态的函数。然而,它们并不能预测未来输入操作的成功或失败。
两次读取最后一行的原因
问题的发生是因为 good() 和 eof( )不一定反映最后输入操作的结果。例如,!f.eof() 不保证前面的 getline() 成功。相反,不在 EOF 并不意味着上次输入操作失败。
替代解决方案:在输入操作后检查流状态
要正确读取和处理行,执行输入后检查流状态至关重要操作:
if (getline(f, line)) { // Use line here } else { // Handle error or end of file }
替代解决方案:使用循环迭代
另一个优雅的解决方案是使用迭代直到 getline() 失败的循环:
for (string line; getline(f, line);) { // Use line here }
避免错误命名 good()函数
最后,需要注意的是,good() 是一个用词不当,并不等同于测试流本身。建议使用上述技术,而不是依赖 good()。
以上是为什么使用`good()`或`!eof()`会读取文件的最后一行两次?的详细内容。更多信息请关注PHP中文网其他相关文章!