- cin.clear():用来将cin的所有状态值重设为有效值
- cin.sync():用来清除输入缓冲区
- cin.ignore(n, ch):忽略输入缓冲区中以’ch’为结束符的那部分内容或指定长度(n)的内容
注:cin出错时,先要用cin.clear()重置状态值后,后面两个函数才能起作用且cin.ignore()比cin.sync()更灵活
以下内容转载自http://blog.sina.com.cn/s/blog_8d3652760100wl9r.html
如果标示符没有改变那么即使清除了数据流也无法输入。所以两个要联合起来使用。例如:
#include<iostream>
using namespace std;
int main()
{
//int型变量中放了char型数据,failbit置1
//输出1
//输出不确定值
//在此处failbit又为1
}
二、cin.ignore(a,ch)
它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。
比如可以这么用:
cin.ignore(1024,'\n'),通常把第一个参数设置得足够大,这样实际上总是只有第二个参数'\n'起作用,所以这一句就是把回车(包括回车)之前的所以字符从输入缓冲(流)中清除出去。
三、cin.sync()和cin.ignor()的比较
另外,对于绑定了输出的输入流,调用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()更精确控制缓冲区。(1)
(1)参考于:http://blog.csdn.net/lann64/article/details/3544479