6

我只是在复习我的考试,无法理解我们讲师提供的以下内容:

打开fstreams时,检查是否打开

  • 然后在检查 input_file.fail() 之前阅读

  • 如果您在阅读前检查,您可能会得到额外的不需要的输入

先读对我来说没有意义,你不应该先检查吗?

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

4

1 回答 1

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

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

希望这可以帮助!

于 2013-06-19T22:59:25.967 回答