一、cin.clear()、cin.sync()
cin.clear()是用來更改cin的狀態標示符的。
cin.sync()是用來清除緩存區的數據流的。
如果標示符沒有改變那麼即使清除了數據流也無法輸入,反之同理。所以兩個要聯合起來使用。例如:
#include<iostream>
using namespace std;
int main()
{
int a;
cout<<"輸入一個字母:"<<endl;
cin>>a; //int型變量中放了char型數據,failbit置1
cout<<"cin.fail()="<<cin.fail()<<endl; //輸出1
//cin.clear();
//cin.sync();
cout<<"輸入一個數字:"<<endl; //由於failbit值爲1,輸入流不能正常工作
cin>>a; //故此處的輸入無效
cout<<a<<endl; //輸出不確定值
cin.clear(); //此處用cin.clear()流標誌復位
//cin.sync();
cout<<"cin.fail()="<<cin.fail()<<endl; //此處failbit已爲0
cout<<"輸入一個數字:"<<endl;
//但剛纔輸入的字符並沒有從流中清除,所以cin>>a又把那個字符放入a中,流輸入流又不能正常工作
cin>>a;
cout<<a<<endl; //輸出不確定值
cout<<"cin.fail()="<<cin.fail()<<endl; //在此處failbit又爲1
cin.clear(); //再次修復輸入流
cin.ignore(); //取走剛纔流中的字符
cout<<"輸入一個數字:"<<endl; //再次接收用記輸入,這次輸入數字,正常輸出了
cin>>a;
cout<<"a="<<a<<endl;
//現在再看一下輸入流的failbit
cout<<"cin.fail()="<<cin.fail()<<endl;//輸出0,表明輸入流已恢復正常
return 0;
}
二、cin.ignore(a,ch)
從輸入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用。
每拋棄一個字符,它都要計數和比較字符:如果計數值達到a或者被拋棄的字符是ch,則cin.ignore()函數執行終止;否則,它繼續等待。
它的一個常用功能就是用來清除以回車結束的輸入緩衝區的內容,消除上一次輸入對下一次輸入的影響。
比如可以這麼用:
cin.ignore(1024,’\n’),通常把第一個參數設置得足夠大,這樣實際上總是隻有第二個參數’\n’起作用,所以這一句就是把回車(包括回車)之前的所以字符從輸入緩衝(流)中清除出去。
三、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::max()不過是climits頭文件定義的流使用的最大值,你也可以用一個足夠大的整數代替它。
使用ignore顯然能比sync()更精確控制緩衝區。(1)