C++中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,所以會進入死循環.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM