测试文件输入的流状态:避免双重读取
从文件读取数据时,必须避免多次读取同一行次。但是,在读取之前检查诸如 good() 或 !eof() 之类的流状态可能会导致意外行为。
考虑以下代码:
ifstream f("x.txt"); string line; while (f.good()) { getline(f, line); // Use line here. }
此代码旨在读取所有行从文件开始直到到达末尾。但是,它会读取最后一行两次。要理解原因,我们需要深入研究流状态标志的内部结构。
流状态标志
good()、eof()、fail() 和bad() 是指示输入流当前状态的流状态标志。 good() 标志通常期望指示流是否处于有效状态以供进一步读取,但这并不严格准确。更准确的描述是不存在错误或文件结束条件。
good() 和 !eof() 的问题
当您检查流时.good() 或 !stream.eof() 在读取之前,您不会询问流下一次读取操作是否会成功。您仅查询当前状态。
例如,当从文件中读取最后一行时,会设置 eof() 标志。但是,good() 标志可能仍然为 true,表示上次读取期间没有发生错误。
解决方案
为了避免重复读取,正确的做法是读取操作后测试流:
// Read all lines from a file for (std::string line; getline(f, line);) { process(line); } // Read an integer and store it in foo int foo; if (f >> foo) { use(foo); } else { handle_error(); }
此方法可确保您只处理从文件中成功读取的数据。
以上是使用 C 文件输入流时如何避免重复读取行?的详细内容。更多信息请关注PHP中文网其他相关文章!