cin.clear()與cin.sync()

我們先來談談cin.clear的作用,第一次看到這東西,很多人以爲就是清空cin裏面的數據流,而實際上卻與此相差很遠,首先我們看看以下代碼:

#include <iostream> 
using namespace std; 

int main() 
{ 
        int a; 
        cin>>a; 
        cout<<cin.rdstate()<<endl; 
        if(cin.rdstate() == ios::goodbit)
{
cout<<"輸入數據的類型正確,無錯誤!"<<endl; 
             } 
        if(cin.rdstate() == ios_base::failbit) 
        { 
                cout<<"輸入數據類型錯誤,非致命錯誤,可清除輸入緩衝區挽回!"<<endl; 
        } 
        system("pause"); 
}

我們定義要輸入到的變量是整型,但如果我們輸入了英文字母或者漢字,那就會發生錯誤,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 <iostream> 
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用於清除當前輸入緩衝區中的內容。

#include <iostream>

int main()
{
 using namespace std;
    
 int a; 
 cin >> a;
 cout << a <<endl;
 cin >> a ;
 cout <<a <<endl;
 cin.clear();
 cin.sync();  // 可以將cin.clear();cin.sync();  不同時註釋掉試一下就知道了
 cin >> a;
 cout <<a <<endl;

return 0;

}

 cin.sync();    // 這個函數是用來清空緩衝區的 

cin.clear();的錯誤是清楚錯誤標誌
例如一下程序
#include <iostream>
using namespace std;

int main()
{ int a,b;
  cin>>a;
  cin>>b;

  
 return 0;
}
假如,運行都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()一起用 
發佈了23 篇原創文章 · 獲贊 4 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章