第8章 標準IO庫 2

2021-06-02 01:58:26 字數 2240 閱讀 1253

8.2 條件狀態

io標準庫管理一系列條件狀態(condition state)成員,用來標記給定的io物件是否處於可用狀態,或者碰到了哪種特定的錯誤。

strm::iostate 機器相關的整型名,由各個iostream類定義,用於定義條件狀態。

strm::badbit strm::iostate型別的值,用於指出被破壞的流。

strm::failbit strm::iostate型別的值,用於指出失敗的io操作。

strm::eofbit strm::iostate型別的值,用於指出流已經到達檔案結束符。

s.eof() 如果設定了流s的eofbit值,則該函式返回true。

s.fail() 如果設定了流s的failbit值,則該函式返回true。

s.bad() 如果設定了流badbit值,則該函式返回true。

s.good() 如果流處於有效狀態,則該函式返回true。

s.clear() 將流s中的所有狀態值都重設為有效狀態。

s.clear(flag) 將流s中的某個特定條件狀態設定為有效。flag的型別是strm::iostate.

s.setstate(flag) 給流s新增指定條件。flag的型別是strm::iostate。

s.rdstate() 返回流的當前條件,返回值型別為strm::iostate。

int i;

while(cin >> i)

while語句檢測條件表示式返回的流,從而間接地檢查了流的狀態。如果成功輸入,則條件檢測為true。

1. 條件狀態

某些程式則需要更詳細地訪問或控制流的狀態,此時除了知道流處於錯誤狀態外,還必須了解它遇到了哪種型別的錯誤。

所有流物件都包含乙個條件狀態成員,該成員由setstate和clear操作管理。這個狀態成員為iostate型別,這是由各個iostream類分別定義的機器相關的整型。該狀態成員以二進位制位(bit)的形式使用。

每個io類還定義了三個iostate型別的常量值,分別表示特定的位模式。這些常量值用於指出特定型別的io條件,可與位操作符一起使用,以便在一次操作中檢查或設定多個標誌。

badbit標誌著系統級的故障,如無法恢復的讀寫錯誤。如果出現了這類錯誤,則流通常就不能繼續使用了。如果出現的是可恢復的錯誤,此時則設定failbit標誌,這種導致設定failbit的問題是可以修正的。eofbit是在遇到檔案結束符時設定的,此時同時還設定了failbit。

流的狀態由bad、fail、eof和good操作揭示。如果bad、fail或者eof中的任意乙個為true,則檢查流本身將顯示該流處於錯誤狀態。類似地,如果這三個條件沒有乙個為true,則good操作將返回true。

clear和setstate操作用於改變條件成員的狀態。clear操作將條件重設為有效狀態。在流的使用出現了問題並作出補救後,如果我們希望把流重設為有效狀態,則可以呼叫clear操作。使用setstate操作可開啟某個指定的條件,用於表示某個問題的發生。除了新增的標記狀態,setstate將保留其他已存在的狀態變數不變。

2. 流狀態的查詢和控制

int ival;

while(cin >> ival, !cin.eof())

else if(cin.fail())

else

}

在迴圈中,首先檢查流是否已破壞。如果是的話,丟擲異常並退出迴圈。如果輸入無效,則輸出警告並清除failbit狀態。

3. 條件狀態的訪問

rdstate成員函式返回乙個iostate型別的值,該值對應於流當前的整個條件狀態。

int ival;

while(cin >> ival, !cin.eof())

else if(state == iostream::failbit)

else

}

4. 多種狀態的處理

常常會出現需要設定或清除多個狀態二進位制位的情況。此時,可以通過多次呼叫setstate或者clear函式實現。另外一種方法則是使用按位或(or)操作符在一次呼叫中生成「傳遞兩個或更多狀態位」的值。按位或操作使用其操作符的二進位制位模式產生乙個整數數值。對於結果中的每乙個二進位制位,如果其值為1,則該操作的兩個運算元中至少有乙個的對應二進位制位是1.

cin.setstate(iostream::badbit | iostream::failbit);
在呼叫setvalue時,使用這個值來開啟流條件狀態成員中對應的badbit和failbit位。

第8章 標準IO庫

iostream繼承層次 istream和ostream是最上層,istream派生出ifstream和istringstream,ostream派生出ofstream和ostringstream。他們兩者共同派生出iostream。iostream派生出stringstream和fstream。標...

第8章 標準IO庫 6

8.5 字串流 iostream標準庫支援記憶體中輸入 輸出,只要將流與儲存在程式記憶體中的string物件 起來即可。此時,可使用iostream輸入和輸出操作符讀寫這個string物件。標準庫定義了三種型別的字串流 istringstream,由istream派生而來,提供讀string的功能。...

第5章 標準I O庫

當開啟乙個流時,標準i o函式fopen返回乙個指向file物件的指標。該物件通常是乙個結構,它包含了標準i o庫為管理該流所需要的所有資訊,包括 用於實現i o的檔案描述符 指向用於該流緩衝區的指標 緩衝區的長度 當前在緩衝區中的字元數以及出錯標誌等等。應用程式沒有必要檢驗file物件。對乙個程序...