Window对于cin输入流结束的判断

当使用while(cin >> temp) 做循环输入的时候,遇到了无法结束的问题,后来想到window使用 ctrl+z 这个按键组合来结束输入.
使用了这个方式进行结束输入的时候,发现还可以继续输入,并且,最后还会显示出一个奇怪的字符.如下图
^z字符
后来在百度寻找了一段时间的资料后,大概的原理如下.

  1. window使用阻塞式检查,所以只有在用户按下enter之后,才会把数据放入缓冲区,并检测是否到达文件结尾.
  2. 对于ctrl+z这个按键组合,当位于一行之中时,window会它当成一个字符看待,但是当他位于一行的开头时,即ctrl+z的前面没有任何字符,包括空格,系统会把他当终止来看待.
  3. 如果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.则会输出一个空字符.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值