cin标准输入流错误清理

来源:互联网 发布:邓小平纪念馆网络留言 编辑:程序博客网 时间:2024/05/17 23:46
转自:http://blog.csdn.net/liuzhi1218/article/details/6991122
cin.sync()函数
这个是用来清空cin缓冲区里面未读取的信息...例子: 
[cpp] view plaincopy
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. int main () {  
  5.   char first, second;  
  6.   
  7.   cout << "Please, enter a word: ";  
  8.   first=cin.get();  
  9.   cin.sync();  
  10.   
  11.   cout << "Please, enter another word: ";  
  12.   second=cin.get();  
  13.   
  14.   cout << "The first word began by " << first << endl;  
  15.   cout << "The second word began by " << second << endl;  
  16.   
  17.   return 0;  
  18. }  

 

样例输入:youme样例输出:The first word began by yThe second word began by m
 
以下为扩展内容了:cin.clear
 
[cpp] view plaincopy
  1. #include <iostream>   
  2. using namespace std;   
  3.   
  4. int main()   
  5. {   
  6.         int a;   
  7.         cin>>a;   
  8.         cout<<cin.rdstate()<<endl;   
  9.         if(cin.rdstate() == ios::goodbit)  
  10. {  
  11. cout<<"输入数据的类型正确,无错误!"<<endl;   
  12.              }   
  13.         if(cin.rdstate() == ios_base::failbit)   
  14.         {   
  15.                 cout<<"输入数据类型错误,非致命错误,可清除输入缓冲区挽回!"<<endl;   
  16.         }   
  17.         system("pause");   
  18. }  
我们定义要输入到的变量是整型,但如果我们输入了英文字母或者汉字,那就会发生错误,cin里有个方法能检测这个错误,就是cin.rdstate();当cin.rdstate()返回0(即ios::goodbit)时表示无错误,可以继续输入或者操作,若返回4则发生非致命错误即ios::failbit,则不能继续输入或操作.而cin.clear则可以控制我们此时cin里对这个问题的一个标识.语发如下:cin.clear(标识符);标识符号为:goodbit 无错误 Eofbit 已到达文件尾 failbit 非致命的输入/输出错误,可挽回 badbit 致命的输入/输出错误,无法挽回 若在输入输出类里.需要加ios::标识符号 通过cin.clear,我们能确认它的内部标识符,如果输入错误则能重新输入.结合真正的清空数据流方法cin.sync(),请看下例:
#include  using namespace std; int main() { int a; while(1) { cin>>a; if(!cin)            //条件可改写为cin.fail() { cout<<"输入有错!请重新输入"<<endl; cin.clear(); cin.sync();   //清空流} else { cout<<a; break; } } system("pause"); } 
上面的cin默认参数为0,即无错误,正常操作.当我们输入英文字母'k'时,它的状态标识改为fail(即1),即错误,用cout对用户输出信息,再用cin.clear让错误标识改回为0,让我们可以继续输入,再清空流数据继续输入.如果我们没有了cin.clear,则会进入死循环,其过程为我们输入了英文字母,它的状态标识便为fail,当运行到条件判断时,便总是回到错误的条件表示里,并且我们再也没办法输入,因为错误的表示关闭了cin,所以会进入死循环.---------------------------------------------------------------------自己再添加一句:如果输入错误,则再也输入不进去,须用clear.而sync用于清除当前输入缓冲区中的内容。
[cpp] view plaincopy
  1. #include <iostream>  
  2.   
  3. int main()  
  4. {  
  5.     using namespace std;  
  6.       
  7.     int a;   
  8.     cin >> a;  
  9.     cout << a <<endl;  
  10.     cin >> a ;  
  11.     cout <<a <<endl;  
  12.     cin.clear();  
  13.     cin.sync();  // 可以将cin.clear();cin.sync();  不同时注释掉试一下就知道了  
  14.      cin >> a;  
  15.     cout <<a <<endl;  
  16.   
  17.     return 0;  
  18.   
  19. }  
  20.   
  21. 例如一下程序:  
[cpp] view plaincopy
  1. #include <iostream>  
  2. using namespace std;  
  3. int main()  
  4. {   
  5.     int a,b;    
  6.     cin>>a;    
  7.     cin>>b;    
  8.     return 0;  
  9. } </iostream>  
[cpp] view plaincopy
  1. cin.sync();    // 这个函数是用来清空缓冲区的 cin.clear();的错误是清楚错误标志例如一下程序  
假如,运行都cin>>a时要求输入,这是输入的是一个字符。这样,和a的类型不符合,cin的状态就标志为错误,因为cin的状态为错误,以后的cin>>都不会被执行。可能你有疑问,“是不是在cin>>b前加个cin.clear(),cin>>b就可以执行”。答案是不是的,因为在第一次输入字符时候cin>>a;因为类型不符合,就不会从输入流中提取数据,也就是说,输入流中,上一次输入的字符仍然存在。那么我们可以使用cin.sync()来清空输入流。cin>>a;cin.clear();cin.sync();cin>>b;总之,cin.clear()一般要和cin.sync()一起用
 
转自:http://www.cnblogs.com/qingcheng/archive/2011/11/16/2251529.html


原创粉丝点击