标准输入流指的是从输入设备(如键盘)中向程序输入数据.在头文件iostream.h中定义 cin,cout,cerr对象.cin是输入流,其他都为输出流.
in是istream的对象,它从输入设备中获得数据.输入的实际过程是:首先输入完数据按下回车,空格等空白字符后,该数据就被送入键盘缓冲区,形成了一个输入流,然后通过提取运算符"
>>"从流中提取数据给程序赋值.
需要注意的是cin在赋值的时候会对数据类型进行检查,cin中有一个状态提示符,用来表示cin是否正确工作,如果类型不匹配状态提示符变成‘1‘,正常时为‘0‘,一旦变为‘1‘,cin便无法再进行赋值.
这时便需要cin,clear(),cin.sync(),cin.ignor()
下面用实例进行说明
#include<iostream> using namespace std; int main() { int a; cout << "输入一个字符:"<<endl; cin >> a; //cin.clear(); //cin.sync(); cout << "failbit=" << cin.fail() << endl; //没有进行错误的处理,输出1 cout << "输入一个数字:"<<endl; cin >> a; //无法输入,现在cin还未恢复正常 cout << "failbit=" << cin.fail() << endl; //任然为1 cin.clear(); //cin.sync(); cout << "failbit=" << cin.fail() << endl; //通过cin.clear()使状态标识符恢复正常‘0‘ cout << "输入一个数字:"<<endl; cin >> a; //无法输入,虽然通过cin.clear()使cin恢复正常,但缓冲区的数据还存在,故直接将原来的字符数据赋给a cout << "failbit=" << cin.fail() << endl; //由于类型不匹配再次出错 cin.clear(); cin.sync(); cout << "输入一个数字:"<<endl; cin >> a; cout << "failbit=" << cin.fail() << endl; //通过cin.clear()重置流,通过cin.sync()清空流,即清空缓冲区数据,然后便可重新输入 system("pause"); return 0; }
cin.clear()作用是重置流,使cin>>可以再次赋值,但并没有清除流中的数据.所以cin.clear()一般和cin.sync()连用.
cin.ignor()作用和cin.sync()作用类似,但它并不是清空整个流,而是部分清除,可以人为控制的,如清理掉当前行,或者清除掉行尾的换行符.ignor的作用显然是更精确的控制缓冲区数据.
比如可以这么用:
cin.ignore(1024,‘\n‘),通常把第一个参数设置得足够大,这样实际上总是只有第二个参数‘\n‘起作用,所以这一句就是把回车(包括回车)之前的所以字符从输入缓冲(流)中清除出去。
下面是部分用法:
cin.ignore(numeric_limits<std::streamsize>::max(),‘/n‘);//清除当前行
cin.ignore(numeric_limits<std::streamsize>::max()); //清除cin里所有内容
不要被长长的名字吓倒,numeric_limits<std::streamsize>::max()不过是climits头文件定义的流使用的最大值,你也可以用一个足够大的整数代替它。
原文:http://www.cnblogs.com/wuyoucao/p/4594367.html