C++初学,一些关于输入输出的问题

首先我们来看看这段经典的输入代码

 基于网上资料搜查,我们可以大致归纳cin.clear()、cin.ignore()的功能具体作用。前者本身的作用并不在于清除输入流中的数据,而是识别错误输入,使我们能够重新输入;后者则是在1024个字符或者输入回车后,清除输入流的数据。

为了验证,我们注记cin.ignore功能,输出cin.get()输入流中的数据,看是否真的被清空。

当我们输入his字符后,由于输入格式错误,转入while循环,而由cin.get我们可知,输入流中还存在数字。

   

而当我们注记掉cin.clear后,while进入了死循环,因为缺少了cin.clear的识别功能,我们无法再次重新输入。而由cin.get的返回的流对象值为-1,而在C语言中,一般EOF的值为-1,ASCII代码值的范围是0~255,不可能出现-1,因此可以用EOF作为文件结束标志。由此可知ignore是起到了清除数据的作用。

 写下此文的原因是希望加深这块的印象,刚把得。

2022/3/15

        还是一次输入问题,我在进行两次容器输入时,第二次输入出现了首字母消失的情况。

        经过调试,发现是在首次输入到s后,就缺失了首字母,有可能是输入流中的^z覆盖了首字母。

        但经过查证,cin 本身会对键盘上是否有作为流结束标志的 Ctrl+Z 或者 Ctrl+D 键按下作出检查,其中两者分别为阻塞式和非阻塞式,Ctrl+Z是以阻塞式,只有按下回车之后才有可能检测在此之前是否有Ctrl+Z按下。还有一个特点,如果输入缓冲区中有可读的数据则不会检测 Ctrl+Z(因为有要读的数据,还不能认为到了流的末尾)。还有一点需要知道,Ctrl+Z产生的不是一个普通的ASCII码值,也就是说它产生的不是一个字符,所以不会跟其它从键盘上输入的字符一样能够存放在输入缓冲区。在另一篇文章中,我们基本可以得知,单独一个^Z系统就会识别出它是文件结束标识符,读的就是EOF。

        但是对于“输入缓冲区中有可读的数据则不会检测 Ctrl+Z”这一说法我们需要明确,指的是在cout输出中不会输出Ctrl+Z,但在peek函数中我们是仍能够看到。一下为实验结果。

 最后输入的结束流符不会被cout读取,但是peek返回的是当前指针指向的元素,就是为EOF,同理我们可以得出结论,EOF符会被传入下一输入流中。之后的工作则是要保证其EOF不流入输入中。

        之后我们注释掉cin,ignore()函数后,发现首字母得以保留图1。同样的我们在替换掉ignore和clear的顺序后也能保留住首字母图二。那毫无疑问我们是在ignore和clear出现问题。下面我将利用PEEK进行输入流中指向字符的问题,关于首字母的问题我们可以通过cin.clear()和cin.sync()函数解决。

                

图1                                                               图2

        注意cin.ignore()一定要在cin.clear()之后执行;如果cin为错误标志是不能执行cin.ignore()函数中忽略字符的操作的,必须先用cin.clear()重新将错误标志置为可用,才能执行ignore()中忽略字符的操作,不懂得可以看ignore源码。这里我们知道为什么替换后首字母能保留,因为无clear的识别,ignore函数无效,并没有清除掉首字母。clear的功能是让我们继续输入。忽略。其中这里我们要重点认识下Ignore的参数,cin.ignore()函数中有两个参数,分别为数值型的a 和 字符型的 ch ,即cin.ignore( a, ch )。它表示从输入流 cin 中提取字符,提取的字符被忽略,不被使用。而每抛弃一个字符,它都要进行计数和比较字符:如果计数值达到 a 或者被抛弃的字符是 ch ,则cin.ignore() 函数执行终止;否则,它继续等待。但后续的调试中涉及到了peek以及输入的问题,我们姑且选择sync全部清流,以更好的调试peek变量。

        这里我们使用peek()函数,功能是返回输入流中的下一字符。得到的结果是在输入流中会保存^z代表的EOF,之后会流入输入流中。

        那我们现在来看看peek功能存在的一些问题,我们在调试时,发现在调试到cout << cin.peek函数下要求进行输入,我们输入任一字符hello后,会紧接着输出peek的结果104,之后hello赋值到s中,这里的疑惑主要是为什么没有进过whle(cin >> )直接输入hello,流入输入中。

 

最后通过实验发现,是由cin.clear + cin.sync函数的功能,错误标识符被更改了,这里允许我们在此输入一串字符到输入流中,所以第一次不用在while(cin >>)进行输入。peek返回的结果也不是输入的字符。当我们注释掉clear后peek返回的是-1(因为清空了流,所以为EOF),注释掉clear后,peek返回的是一数字。 

        我们进行实验,通过循环发现,我们在输入单个数字1时,peek到的时10,输入2 3时对应的为32 10,5 6 7等多个数时,peek到的数字为32 32 10。peek返回的是

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值