我正在修改我的考试,不能理解我们的讲师提供的以下内容:
打开fstream时,检查是否已打开
>然后在检查input_file.fail()之前读取
>如果你在阅读之前检查,你可能会得到一个
额外不需要的输入
我首先阅读没有意义,你不应该先检查一下吗?
如果有人能够解释,我将非常感激:)
解决方法
input_file.fail()确定是否有任何先前的操作失败,而不是即将进行的操作是否会失败.因此,如果你这样写:
if (!input_file.fail()) { int value; input_file >> value; /* ... process value ... */ }
然后在读取值之后,你根本不知道你是否真正读过任何东西.你所知道的就是在你阅读之前,一切都正常.您很可能无法读取整数,因为您遇到了文件的末尾,或者文件中的数据不是整数.
另一方面,如果你写
int value; input_file >> value; if (!input_file.fail()) { /* ... process value ... */ }
然后你试图做一个阅读.如果成功,则处理您已阅读的值.如果没有,您可以对最后一次操作失败的事实作出反应.
(你甚至可以比这更可爱:
int value; if (input_file >> value) { /* ... process value ... */ }
它将读取和测试操作合二为一.你在确认读取成功的时候要清楚得多.)
如果您正在循环中读取,那么执行此操作的方法非常简洁
for (int value; input_file >> value; ) { /* ... process value ... */ }
这清楚地表明,在您能够继续从文件中读取值时循环.
希望这可以帮助!