输入输出流的细节(cin.clear,cin.sync(),cout的一些细节处理)_cout.sync()作用-程序员宅基地

技术标签: C++  

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

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()用来统计提取了多少个字符;

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hyqsong/article/details/37900759

智能推荐

js代码实现tab选项卡效果_js tab选中-程序员宅基地

文章浏览阅读631次。实现tab选项卡效果贴上代码:<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <me..._js tab选中

github上拉去代码执行 npm install报错code:128_error: command failed: d:\program files\git\cmd\gi-程序员宅基地

文章浏览阅读1.9k次。npm ERR! code 128npm ERR! Command failed: D:\Program Files\Git\cmd\git.EXE clone --mirror -q git://github.com/adobe-webplatform/eve.git C:\Users\yantx\AppData\Roaming\npm-cache\_cacache\tmp\git-clon..._error: command failed: d:\program files\git\cmd\git.exe -c core.longpaths=tr

路由选择协议笔记ripv1、ripv2、ripng-程序员宅基地

文章浏览阅读533次。一、基本的rip配置 router rip network+直连主网络这里是ripv1,它是又累的路由协议,子网屏蔽,只通过主网二、被动借口的配置 router rip passive-interface ethernet0passive-interface命令可以喝所有的ip路由协议中配置使用,配置了passive-interface的借口不发送路由更新信息,只侦听rip广..._ip rip send version 1 2含义

oracle dbm备份恢复,ORACLE 11g 用Duplicate恢复Data Guard 备库详细过程-程序员宅基地

文章浏览阅读310次。1、先查找备库控制文件路径先在备库上找出控制文件的路径,通过和主库一样,不过为了以防万一,还是check为好。sql> select name from v$controlfile;NAME--------------------------------------------------------------------------------/oracle/app/oracle/ora..._ora.dbm01.db

Python——字符串2.0(实验)(python programming)-程序员宅基地

文章浏览阅读241次。Python——字符串2.0(实验)(python programming) 直接打s,是程序员看到的;打print(),是用户看到的列表]#列表索引,与数组唯一不同:等号左端可修改转载自:https://www.cnblogs.com/wwwwwei/p/10481653.html..._python程序设计实验字符串

html+css+jQuery写的选择题答题页面_html制作答题网页-程序员宅基地

文章浏览阅读1.5k次。主要是一个选择题和多选题的答题功能使用html+css+js_html制作答题网页

随便推点

VB.net学习笔记(二十七)线程同步上_vbnet同步-程序员宅基地

文章浏览阅读9.2k次。X夫妇二人试图同时从同一账户(总额1000)中支取1000。由于余额有1000,夫妇各自都满足条件,于是银行共支付2000。结果是银行亏了1000元。这种两个或更多线程试图在同一时刻访问同一资源来修改其状态,并产生不良后果的情况被称做竞争条件。 为避免竞争条件,需要使Withdraw()方法具有线_vbnet同步

Unity中减少VR晕眩症的实用技术(Yanlz+Unity+XR+VR+AR+MR+SteamVR+晕眩症+征兆冲突理论+视野+帧速+相对运动错觉+光场VR+立钻哥哥+==)_unity 开发vr很头晕-程序员宅基地

文章浏览阅读4k次,点赞10次,收藏10次。《基于Unity与SteamVR构建虚拟世界》 《基于Unity与SteamVR构建虚拟世界》 版本 作者 参与者 完成日期 备注 SteamVR_Unity_V01_1.0 严立钻 2019..._unity 开发vr很头晕

echarts折线图改变symbol颜色,让圆球颜色和折线相同_echarts symbol颜色-程序员宅基地

文章浏览阅读6.5k次。title: { text: '', left: 'center' }, xAxis: { type: 'category', }, yAxis: { type: 'value' }, series: [{ type: 'line', // 接下来三句是重点,将默认形状改为圆形 symbol: 'circle', symbol..._echarts symbol颜色

Coursera 申请助学金流程和材料_coursera 助学金-程序员宅基地

Coursera是一个非常受欢迎的在线学习平台,本文介绍了在Coursera申请助学金的流程和所需材料。通过选择感兴趣的课程并提交申请,等待15天后会得到申请结果。完成课程后可以获得正式的结课证书。同时,对于可以七天试用的课程,试用期内完成的证书可以免费下载。

Spring Boot 日志配置_springboot指定日志配置文件-程序员宅基地

文章浏览阅读2.5k次,点赞3次,收藏10次。引用步骤(1)编写配置文件在src/main/resources下面添加logback.xml,内容如下:<?xml version="1.0" encoding="UTF-8"?><configuration> <!--======================================= 本地变量 ======================================== --> <!--在没有定义${LOG_.._springboot指定日志配置文件

linux gcc 查看版本号,如何查看Linux或者gcc版本-程序员宅基地

文章浏览阅读1.8w次,点赞3次,收藏6次。匿名用户1级2016-12-29 回答1. 查看Linux版本cat/etc/issueLinaro 12.07 \n \l2. 查看内核版本1)cat/proc/versionLinux version 2.6.38-13-generic(buildd@rothera) (gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)) #57-Ubuntu S..._gcc version