这是我在一本书中找到的代码片段:
#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;
}
此代码段计算将一个数字输入到输入流中的次数,并使用while循环接收和未知数量的数字。
但是,问题是,当我输入不同的数字而不是一个重复输入时。 (然后输入Ctrl + D,表示文件结束)。在显示最后一个值的次数之前,输入流似乎需要额外输入。
例如,如果我输入
1 2 3 4
以空格分隔,最后按Ctrl + D指示文件结尾,输出将为:
1 occurs 1 times
2 occurs 1 times
3 occurs 1 times
<requests for input>
4 occurs 1 times
但是如果我在流中输入了不是整数的内容
1 2 3 4a
输出正常运行。
这是为什么?
答案 0 :(得分:3)
while (std::cin >> val)
将循环播放,直到cin
进入不再有效的状态为止。使用Ctrl + D发送EOF字符,该字符将导致eof
的{{1}}标志被设置并使其评估为cin
,从而结束循环。
false
的输入基本上执行相同的操作。当1 2 3 4a
需要一个数字时,如果输入字母,则会导致输入设置cin
的{{1}}标志失败。这也会导致fail
的求值为cin
并结束循环。
解决所有这些问题的一种方法是使用cin
并一次获取所有输入。然后,您可以将false
加载到std::string
中,并从中获取单个元素。
std::string