C I O庫流狀態標誌位

2021-06-05 02:43:23 字數 3160 閱讀 2139

再來看看輸入狀態標記位、狀態測試函式、狀態設定函式之間的關係:

輸入狀態標記位常量有以下幾個:

標記位常量

常量 含義 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操作都會失敗...