C 中輸入流istream狀態管理3

2021-10-16 10:12:23 字數 1939 閱讀 2217

在《c++中輸入流istream狀態管理2》中提到,rdstate()成員函式可以獲取流當前的狀態,即ios_base::iostate。

ios_base::iostate對應的狀態有ios_base::goodbit、ios_base::eofbit、ios_base::badbit和ios_base::failbit。ios_base::iostate是四個位元組,即32位的變數,在xiosbase中定義。ios_base::goodbit、ios_base::eofbit、ios_base::failbit和ios_base::badbit的值分別是0x00000000、0x00000001、0x00000002和0x00000004。從以上狀態的值中可以看出,當ios_base::iostate的值是0時,即goodbit的值是0時,表示流未發生錯誤。

ios_base類的clear()函式的作用是清除所有的錯誤標誌,這裡的錯誤標誌指的是ios_base::badbit和ios_base::failbit。

clear()函式有兩種使用方法,分別是不帶引數和帶引數。

clear()函式不帶引數時,實際上其引數是有預設值的。

void clear(iostate state = goodbit, bool reraise = false);
其中,引數state表示在清除了所有引數後,流需要保持的狀態,預設狀態是goodbit,即沒有錯誤狀態;引數reraise表示是否會再產生異常,預設值是false,即不再產生異常。

ifstream ifs("test.txt");

ios_base::iostate s = ifs.rdstate();

ifs.clear();

s = ifs.rdstate();

在以上**中,定義了乙個與「test.txt」檔案相關的ifstream流的物件ifs,因為「test.txt」檔案不存在,所以rdstate()函式獲取到的流狀態是failbit,所以s的值是0x00000002。當呼叫了clear()函式之後,將流狀態設定為goodbit,此時s的值變為0x00000000。

clear()函式帶引數時的使用方法為

void clear(io_state state);
其中,引數state表示清除了所有引數後,流需要保持的狀態。

ifstream ifs("test.txt");

ios_base::iostate s = ifs.rdstate();

ifs.clear(ios_base::eofbit);

s = ifs.rdstate();

與「2.2.1 不帶引數」中提到的**類似,在呼叫clear()函式之前,s的值是0x00000002。呼叫clear()函式時,將流需要保持的狀態設定為ios_base::eofbit,所以,在呼叫clear()函式之後,s的值變為0x00000001。

setstate()函式的作用是追加流的屬性。

setstate()函式的使用方法是

void setstate(iostate _state);
其中沒引數_state表示追加的屬性。需要注意的是,clear()函式的帶引數使用方法是先將流的原先屬性刪除,然後在設定流的屬性,即不保持流的原先屬性;setstate()函式是保持流原先屬性的基礎上,再追加新的屬性。

ifstream ifs("test.txt");

ios_base::iostate s = ifs.rdstate();

ifs.setstate(ios_base::eofbit);

s = ifs.rdstate();

在呼叫setstate()函式之前,s的值是0x00000002。呼叫setstate()函式時,在流原先的狀態failbit的基礎上,再追加eofbit,即此時s的值是0x00000003。

輸入流類 istream 常用成員函式

c 標準庫里有針對外設輸入操作進行處理的類 istream。而常用的cin則是istream的類物件。因此實際上我們可以重新定義新的輸入流物件代替cin對輸入進行操作。而我們常用的istream類成員函式有如下一些 原型 istream getline char s,streamsize n,cha...

輸入流cin的狀態

對於標準輸入流cin,有時該操作會發生錯誤,如 include using namespace std int main 當輸入的不是整形int而是字元時,輸入流就會發生錯誤。乙個輸入流一旦發生錯誤,其後的io操作都會失敗。如上面的程式,當輸入字元後,程式就進入死迴圈狀態。這是因為一旦輸入失敗,會產...

c 標準輸入流

cin是istream類的派生類物件,它從標準輸入裝置 鍵盤 獲取資料,程式中的變數通過流提取符 從流中提取資料。提取資料時通常跳過輸入流中的空格,tab鍵,換行符等空白字元。只有在鍵盤輸入完資料並按enter鍵之後,該行資料才被送入鍵盤緩衝區,形成輸入流,提取運算子 才能從中提取資料 在遇到無效字...