当使用while(cin >> temp)
做循环输入的时候,遇到了无法结束的问题,后来想到window使用 ctrl+z
这个按键组合来结束输入.
使用了这个方式进行结束输入的时候,发现还可以继续输入,并且,最后还会显示出一个奇怪的字符.如下图
后来在百度寻找了一段时间的资料后,大概的原理如下.
- window使用阻塞式检查,所以只有在用户按下
enter
之后,才会把数据放入缓冲区,并检测是否到达文件结尾. - 对于
ctrl+z
这个按键组合,当位于一行之中时,window会它当成一个字符看待,但是当他位于一行的开头时,即ctrl+z
的前面没有任何字符,包括空格,系统会把他当终止来看待. - 如果
ctrl+z
位于一行的中间,则系统会读取这个无意义的字符,但是后续的字符并不是读取,直接丢弃,在我的电脑上(window10系统),遇到ctrl+z
之后的所有字符都不再读取,直到遇到下一个ctrl+z
这个与系统的对结束字符的处理方式有关.
对于while(cin >> temp)
如果输入一个ctrl+z
之后,cin的状态标识符会被更改,所以会遇到下面这个问题.
第二个输入被直接跳过了!!!这里要额外的注意,endl
确实是刷新流,但是,它并不改变cin的状态标识符.第一个while循环时,输入了ctrl+z
改变了cin状态标识符,使其值为0.所以可以跳出第一个while循环,但同理,第二个循环他也进不去.必须用cin.clear()
来清除这个状态标识符.
第二个while之所以还输出原来输入的字符,并不是因为数据还在流里,而是第二个循环根本没进去,p2仍旧是原先的那些数据.如果将p2换成一个新的string对象p3.则会输出一个空字符.