输入输出流的细节(cin.clear,cin.sync(),cout的一些细节处理)

有时候编程序,会莫名其妙的得不到正确的输出结果,因为没有正确的考虑流的细节;

1.要注意输入与接受变量的类型要匹配,例如给int类型输入3.14,只能接受到3而已;

2.更正:在控制台程序中,屏幕上的输入都会加入到输入流(键盘缓冲区)中,包括最后按下的“Enter”键,如若不加处理,都可能作为下一个字符被cin接受;

3.处理输入流缓冲区的函数有:

(1)cin.clear(); 用来更改cin的状态标示符的 例如输入与接受变量不匹配时,cin会出错,cin的标志位failbit变为1(表示出错),使用cin.clear();就能将Failbit改回0,从而使得cin继续可以使用。常常后接

cin.clear();
while(cin.get()!='\n')
    continue                    使用来吸收缓冲区导致出错的字符流。

参考http://zhidao.baidu.com/link?url=FRVQWb90Ojum9jlywFD47gMKJKFkRtaGTnpOq1eKqUH_w8M5bzAHPALXdVSiuqHoWE9SZeghUqGkQB3en6DGKq

(2)cin.sync();用来清除、刷新缓冲区数据流的未读数据。

(3)cin.ignor();cin.ignore(1024,'\n'),通常把第一个参数设置得足够大,这样实际上总是只有第二个参数'\n'起作用,所以这一句就是把回车(包括回车)之前的所以字符从输入缓冲(流)中清除出去。

(从输入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用。每抛弃一个字符,它都要计数和比较字符:如果计数值达到a或者被抛弃的字符是ch,则cin.ignore()函数执行终止;否则,它继续等待。

它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。

比如可以这么用:

(4)cin.sync()和cin.ignor()的比较

    sync()的作用就是清除输入缓冲区。成功时返回0,失败时badbit会置位,函数返回-1.
另外,对于绑定了输出的输入流,调用sync(),还会刷新输出缓冲区。

 

但由于程序运行时并不总是知道外部输入的进度,很难控制是不是全部清除输入缓冲区的内容。通常我们有可能只是希望放弃输入缓冲区中的一部分,而不是全部。比如清除掉当前行、或者清除掉行尾的换行符等等。但要是缓冲区中已经有了下一行的内容,这部分可能是我们想保留的。这个时候最好不要用sync()。可以考虑用ignore函数代替。
cin.ignore(numeric_limits<std::streamsize>::max(),'/n');//清除当前行
cin.ignore(numeric_limits<std::streamsize>::max());     //清除cin里所有内容

不要被长长的名字吓倒,numeric_limits<std::streamsize>::max()不过是climits头文件定义的流使用的最大值,你也可以用一个足够大的整数代替它。

使用ignore显然能比sync()更精确控制缓冲区。

参考:http://blog.sina.com.cn/s/blog_8d3652760100wl9r.html

4.cin.ignore()与cin.getline()

cin.getline(字符指针(char*),字符个数N(int),结束符(char));

此函数会一次读取多个字符(包括空白字符)。它以指定的地址为存放第一个读取的字符的位置,依次向后存放读取的字符,直到读满N-1个,或者遇到指定的结束符为止。若不指定结束符,则默认结束符为'\n'。

5.cin.get()与cin.peek()

cin.get()获取一个字符,输入流减少

cin.peek() 只是从流中读取一个字符检查,并不会从流中将该字符去除,即不改变输入流;

eg: while(cin.peek() != '\n')   //判断输入流(只提出作检查不会影响全部输出),不为回车键时输出

{

char p =cin.get();

cout <<p;

}

6.cin.gcount()与cin.read()

cin.read()用来控制读入多少个字符 eg.   cin.read(buf,20);  只从流中获得20个元素,付给buf中

cin.gcount()用来统计提取了多少个字符;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值