我們談談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(),請看下例:
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,所以會進入死循環.