cin.clear()的用法

   我們談談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.clear()默認參數爲0,即無錯誤,正常操作.當我們輸入英文字母’k’時,它的狀態標識改爲fail,即錯誤,用cout對用戶輸出信息,再用cin.clear讓錯誤標識改回爲0,讓我們可以繼續輸入,再清空流數據繼續輸入.如果我們沒有了cin.clear,則會進入死循環,其過程爲我們輸入了英文字母,它的狀態標識便爲fail,當運行到條件判斷時,便總是回到錯誤的條件表示裏,並且我們再也沒辦法輸入,因爲錯誤的表示關閉了cin,所以會進入死循環.


轉載自 : 博客園
原文鏈接 :https://www.cnblogs.com/tonglingliangyong/p/3908463.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章