回答https://stackoverflow.com/a/10379322/924727说明会发生什么。关于为什么,我们必须深入一点哲学。
C++ 流模型不考虑“人机交互”:它是一种通用转换器,可将几乎无限的字符序列转换为以空格分隔的“值”列表,然后再转换为提供的“变量”。
没有“对话的输入和输出交错”的概念。如果您将输入写入文本文件,例如myinput.txt
(取消正确输入)
ABC456 9 7.8 XYZ
Y
ABC456 5 6.7 XYZ
N
并从命令提示符运行您的程序,例如
myprogram < myinput.txt
您的程序将运行......并且不需要“暂停”即可查看输出,因为没有人坐在那里查看并回答它。
程序暂停等待用户输入不是因为cin >>
,而是因为cin
没有处于失败状态并且缓冲区为空并且缓冲区重新映射的源是控制台。在返回之前等待'\n'的是控制台,而不是cin。
什么时候cin >> n
叫...
- 该
operator>>
函数被调用,它...
- 从流语言环境中获取 num_get facet 并调用它的 get 函数...
- 重复调用流缓冲区
sbumpc
以获取数字并计算数值。
- 如果缓冲区有内容,它只是一个接一个地返回它的字符。当没有更多字符存在时(或者如果它是空的)......
- 缓冲区要求操作系统从低级文件中读取。
- 如果文件是控制台,则调用控制台内部行编辑器:
- 这使得控制台卡住让用户按下字符和一些控件(例如退格),直到按下 Enter 时
- 控制台行编辑器将该行返回给操作系统,这将使输入 CON 文件的内容可用...
- 这是由填充自身的缓冲区读取的(在将读取的字符传递给 cvt 语言环境方面,但这是一个细节之后)。
- 现在做自己的回报展开。
所有这些机制都使得 - 如果您键入的内容超过要求 - 缓冲区内容仍然可用于下一次>>
调用,独立于它是否是另一个程序行。
正确的“更安全”的解析需要,在读取输入后,要清除流状态并忽略以下内容直到下一个'\n'
. 这通常是通过
cin.clear();
cin.ignore(numeric_limits<std::streamsize>::max(), '\n');
这样,任何输入的内容都会被丢弃,接下来会cin>>
找到一个没有数据的缓冲区(只是'\n'
, 被修剪为“开始空间”),从而导致控制台再次进入行编辑模式。