c++標準庫對於流定義了一套它本身的狀態變化規則,在ios_base.h聲明的ios_base類中,它定義了一個枚舉類型_Ios_Iostate來表示流狀態,主要有如下四種:ios
狀態 | 說明 |
---|---|
badbit | 在輸入輸出時遇到了系統級錯誤,會置爲badbit |
eofbit | 讀取文件時讀到了文件末尾,就會置爲eofbit |
failbit | 往流緩衝區寫入或者讀取數據發生錯誤時,會被置爲failbit |
goodbit | 上面三種都沒有時,就是goodbit |
另外ios_base另外定義了一個保護成員iostate _M_streambuf_state;
來表示當前流的狀態。c++
對於流狀態操做函數,是定義在類basic_ios類中,它是ios_base的派生類,位於頭文件basic_ios.h中,這裏不討論basic_ios類的使用,只說明它裏面定義的狀態操做函數.函數
說明:枚舉類型_Ios_Iostate取了個別名,叫iostate。
函數原型以下:this
//返回當前流狀態 iostate rdstate() const { return _M_streambuf_state; } //默認清除全部異常狀態,置爲goodbit void clear(iostate __state = goodbit); //在當前流狀態基礎上根據傳入狀態進行追加 void setstate(iostate __state) { this->clear(this->rdstate() | __state); } //若是當前狀態是goodbit,那麼返回true,不然返回false bool good() const { return this->rdstate() == 0; } //若是當前流狀態是eofbit,那麼返回true,不然返回false bool eof() const { return (this->rdstate() & eofbit) != 0; } //若是當前流狀態是failbit,那麼返回true,不然返回false bool fail() const { return (this->rdstate() & (badbit | failbit)) != 0; } //若是當前流狀態是badbit,那麼返回true,不然返回false bool bad() const { return (this->rdstate() & badbit) != 0; }
因此若是咱們想主動的設置流狀態,能夠使用setstate函數,想清除全部異常狀態,能夠使用clear函數,想判斷當前流狀態是否正常,就使用good函數。spa
下面用一張圖來總結一下流狀態在這兩個類裏面的關聯:code