我只是为了考试而修改,不能理解我们讲师提供的以下内容:
打开fstream时,请检查是否已打开
然后在检查input_file.fail()
如果您在阅读之前进行检查,最终可能会得到一个 额外的不需要的输入
首先阅读我没有意义,你不应该先检查吗?
如果有人能够解释,我将非常感激:)
答案 0 :(得分:10)
input_file.fail()
确定是否有任何先前的操作失败,而不是即将发生的操作是否会失败。因此,如果你这样写:
if (!input_file.fail()) {
int value;
input_file >> value;
/* ... process value ... */
}
然后在阅读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 ... */
}
这清楚地表明,在您能够继续从文件中读取值时循环。
希望这有帮助!