cin.clear()和cin.sync

cin.clear()、cin.sync()
    cin.clear()是用來更改cin的狀態標示符的。
    cin.sync()是用來清除緩存區的數據流的。

若是標示符沒有改變那麼即便清除了數據流也沒法輸入。因此兩個要聯合起來使用。例如:ios

#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;
}
2、cin.ignore(a,ch)     從輸入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用。每拋棄一個字符,它都要計數和比較字符:若是計數值達到a或者被拋棄的字符是ch,則cin.ignore()函數執行終止;不然,它繼續等待。 它的一個經常使用功能就是用來清除以回車結束的輸入緩衝區的內容,消除上一次輸入對下一次輸入的影響。 好比能夠這麼用: cin.ignore(1024,'\n'),一般把第一個參數設置得足夠大,這樣實際上老是隻有第二個參數'\n'起做用,因此這一句就是把回車(包括回車)以前的因此字符從輸入緩衝(流)中清除出去。 3、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()更精確控制緩衝區。
相關文章
相關標籤/搜索