用于读取文件的输入循环

An input loop for reading a file

本文关键字:输入 循环 文件 读取 用于      更新时间:2023-10-16

我是一名编程初学者,我需要在书中介绍的这段代码上得到帮助。

for (My_type var; ist >> var;) { // read until end of file 
// maybe check that var is valid 
// do something with var
}
if (ist.fail()) {
ist.clear(); 
char ch; 
// the error function is created into the book : 
if (!(ist >> ch && ch == '|')) error("Bad termination of inputn"); 
}
// carry on : we found end of file or terminator

此示例是关于从文件中读取值的。我试过使用它,但在理解它的工作原理时遇到了一些麻烦:

  1. 如果我在循环后尝试测试流状态,我会得到eoffail状态,这怎么可能?如何避免同时触发faileof

  2. EOF究竟是什么时候触发的?从我的测试来看,当我达到序列的最后一个值时,它似乎被触发了,这个定义正确吗?

谢谢。

如果我试图在循环后测试流状态,我会得到eof和fail状态,这怎么可能?如何避免同时触发fail和eof?

如果有一个字符无法转换为My_type,并且该字符是文件中的最后一个字符,则可能发生这种情况。然后,将设置failbiteofbit

EOF究竟何时触发?从我的测试来看,当我达到序列的最后一个值时,它似乎被触发了,这个定义正确吗?

是的,读取最后一个字符时会设置eofbit

引用std::basic_istream:

如果满足以下条件之一,提取将停止:

  • 文件结尾出现在输入序列上;

  • 在输出序列中插入失败(在这种情况下,不提取要插入的字符);

  • 发生异常(在这种情况下,异常被捕获,只有在exceptions()中启用了failbit时才会重新抛出)。