在C ++ Primer示例中被控制流执行所困惑

时间:2014-02-09 11:29:33

标签: c++ input user-input eof cin

我正在阅读C ++ Primer(第5版)。在1.4.4节中,有以下示例:

#include <iostream>
int main()
{
   // currVal is the number we're counting; we'll read new values into val
   int currVal = 0, val = 0;
   // read first number and ensure that we have data to process
   if (std::cin >> currVal) {
      int cnt = 1; // store the count for the current value we're processing
      while (std::cin >> val) { // read the remaining numbers
         if (val == currVal) // if the values are the same
            ++cnt; // add 1 to cnt
         else { // otherwise, print the count for the previous value
         std::cout << currVal << " occurs " << cnt << " times" << std::endl;
         currVal = val; // remember the new value
         cnt = 1; // reset the counter
      }
   } // while loop ends here
      // remember to print the count for the last value in the file
      std::cout << currVal << " occurs " << cnt << " times" << std::endl;
   } // outermost if statement ends here
   return 0;
}

使用给定输入运行它时   42 42 42 42 42 55 55 62 100 100 100

打印

42次发生5次

55次发生2次

62次发生1次

但是,为了获得最终输出线

100次发生3次

你必须按CTRL + D.然后打印出来并退出程序。

这是为什么?对我来说,看起来应该打印最后一行,程序退出其他人。我似乎误解了控制流程是如何执行的,所以有人可以澄清一下吗?

ps我知道这个Incorrect output. C++ primer 1.4.4C++ Primer fifth edtion book (if statement) is this not correct?但是,这些都没有解释为什么你必须按ctrl + d打印最终语句。

2 个答案:

答案 0 :(得分:3)

那是因为这部分:

while (std::cin >> val)

为了终止读取输入流,您必须使用由Ctrl-D提供的EOF来终止它。

考虑一下:默认情况下cin跳过空格,每次输入一个数字时,用空格(空格,制表符或换行符)将其分隔开来。

程序将如何终止输入? 答案是当它读取EOF字符时 - 如前所述,由Ctrl-D提供。 < / p>

答案 1 :(得分:2)

您必须按 CTRL + D ,否则程序无法知道您的stdin流何时完成。否则它将永远坐在while (std::cin >> val,而不会终止。