为什么先读取文件再检查?

时间:2013-06-19 22:56:38

标签: c++ iostream

我只是为了考试而修改,不能理解我们讲师提供的以下内容:

打开fstream时,请检查是否已打开

  • 然后在检查input_file.fail()

  • 之前阅读
  • 如果您在阅读之前进行检查,最终可能会得到一个 额外的不需要的输入

首先阅读我没有意义,你不应该先检查吗?

如果有人能够解释,我将非常感激:)

1 个答案:

答案 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 ... */
}

这清楚地表明,在您能够继续从文件中读取值时循环。

希望这有帮助!