再來看看輸入狀態標記位、狀態測試函式、狀態設定函式之間的關係:
輸入狀態標記位常量有以下幾個:
標記位常量
常量 含義 failbit標記位的值
eofbit標記位的值
badbit標記位的值
轉化為10進製
ios::failbit
輸入(輸出)流出現非致命錯誤,可挽回
1 0
0 4
ios::badbit
輸入(輸出)流出現致命錯誤,不可挽回
0 0
1 2
ios::eofbit
已經到達檔案尾
0 1
0 1
ios::goodbit
流狀態完全正常
0 0
0 0
下面來解釋這張**:
ios::failbit ios::badbit ios::eofbit ios::goodbit均為常量,它們任何乙個都代表了一種流狀態,因此稱為「輸入狀態標記位常量」。
比如,ios::failbit表示的是流狀態為
流的failbit標記位值為1,eofbit標記位值為0,badbit標記位的值為0。
始終牢 記:failbit,badbit,eofbit組成了流狀態
注意:它們不是failbit、badbit、eofbit、goodbit這四個標記位的存貯變數。
我們可以用輸出語句來驗證:
cout << ios:: failbit << endl;
cout << ios:: eofbit << endl;
cout << ios:: badbit << endl;
cout << ios:: goodbit << endl;
輸出的結果為:
4 2
1 0
同樣是將3個標記位視為二進位制數轉化為十進位制的原理。
下面分析clear()函式:
cin.clear(ios::failbit);
使得cin的流狀態將按照ios::failbit所描述的樣子進行設定:failbit標記位為1,eofbit標記位為0,badbit標記位為0。無需擔心goodbit標記位,failbit、eofbit、badbit任何乙個為1,則goodbit為0。(goodbit是另一種流狀態的表示方法)
cin.clear(ios::goodbit);
使得cin的流狀態將按照ios::goodbit所描述的樣子進行設定:failbit標記位為0,eofbit標記位為0,badbit標記位為0。此時goodbit標記位為1,從另乙個角度表示cin的流狀態正常。
因此clear() 函式作用是:將流狀態設定成括號內引數所代表的狀態,強制覆蓋掉流的原狀態。
再來分析一下setstate()函式:
與clear()函式不同,setstate()函式並不強制覆蓋流的原狀態,而是將括號內引數所代表的狀態疊加到原始狀態上。
比如,假設cin流狀態初始正常:
cin.setstate (ios::failbit); //在cin流的原狀態的基礎上將failbit標記位置為1
cin.setstate (ios::eofbit); //在上一步結束的基礎上,將cin流狀態的eofbit標記位置為1
兩條語句結束後,cin的faibit標記位和eofbit標記位均為1,badbit標記位為0
對比clear()函式的效果:
cin.clear (ios::failbit); //將cin的流狀態置為ios::failbit所描述的狀態
cin.clear (ios::eofbit); //將cin的流狀態置為ios::eofbit所描述的狀態
兩條語句結束後,cin的eofbit標記位為1,而failbit標記位和badbit標記位為0
即使兩種情況,在執行完各自的第一條語句後,cin的流狀態情況相同,但當執行完第二條語句,本質區別就顯露出來。
最後來看看如何利用rdstate()函式和輸入狀態標記位常量來判斷輸入流的狀態:
#include
using namespace std;
int main()
利用前面所講的rdstate() 函式返回值原理和輸入狀態標記位常量表,不難理解:
rdstate() 函式返回當前流物件的failbit、eofbit、badbit3個標記位狀態的十進位制值
輸入狀態格式常量也是failbit、eofbit、badbit3個標記位狀態的十進位制值
比如cin流狀態讀取錯誤,即failbit標記位為1,eofbit標記位為0,badbit標記位為0,則:
cin.rdstate()的返回值為4,而格式常量ios::failbit的十進位制也是4
因此,if(cin.rdstate() == ios::failbit) 判斷為ture
因此程式當中的兩個if語句能有效識別出流狀態
再來看看有些許不同的程式:
#include
using namespace std;
int main()
輸出結果為:
6 請按任意鍵繼續...
原因為何?
cin流狀態被設定成failbit標記位置為1,eofbit標記位置為1,badbit標記位為0
那麼cin.rdstate()的返回值二進位制為110,十進位制為6,即輸出6。
參照輸入狀態標記位常量表:
ios::goodbit的二進位制為000,十進位制為0,因此if(cin.rdstate() == ios::goodbit)判斷為false
ios::failbit的二進位制為100,十進位制為4,因此if(cin.rdstate() == ios::failbit)判斷為false
然後system("pause"); 語句使得輸出 請按任意鍵繼續...
很有意思吧,cin物件明明failbit標記位為1,但表示式cin.rdstate() == ios::failbit卻是false,這就是原因。
rdstate()函式與輸入狀態標記位常量的對比是嚴格按照數值對比的。
另外:關於cin物件,輸入內容與接受的變數 完全匹配,部分匹配,完全不匹配的各種情況下,標記位將會如何變化,請參考
不對之處,敬請指教。
C IO流條件狀態
測試平台 windows7 vs2010 iostate 流的標誌位 條件狀態 具體如下 標誌位 列舉常量,十進位制分別代表0 1 2 4 16,他們與流狀態無關,標誌位都是常量。判斷標誌位是否有效可以用對應標誌位的成員函式。strm badbit 用來指出流已經奔潰 100 在這裡strm表示一種...
用標誌位表示狀態
在很多框架中,我們都能看到類似 int 0x0010 這種 我們只知道他表示狀態,很牛x,但是具體為啥要這樣,或者它是如何表示多個不同狀態的卻全然不知.回顧位運算 位運算符號列表 符號英文名 中文名 or或 and與 not非 xor 異或 右移 左移 無符號右移 最高位始終補0 每種運算子的運算方...
c io庫條件狀態
badbit 用來指出流已經崩潰,屬於系統級錯誤,如不可恢復的讀寫錯誤。failbit 表示乙個io操作失敗了,比如讀取數字卻讀取的是字元,這是可以恢復的 eofbit 用來表示檔案達到檔案結尾,這也是可以恢復的 goodbit 表示流的狀態正常 注意的是,一但流發生錯誤,其上後續的io操作都會失敗...