測試平台:windows7+vs2010
iostate:流的標誌位(條件狀態),具體如下
標誌位:列舉常量,十進位制分別代表0、1、2、4、16,他們與流狀態無關,標誌位都是常量。判斷標誌位是否有效可以用對應標誌位的成員函式。
strm:
:badbit//用來指出流已經奔潰(100),在這裡strm表示一種io型別,比如istream
strm:
:failbit//用來指出乙個io操作失敗(010)
strm:
:eofbit//指出流到達了檔案結束(001)
strm:
:goodbit//指出流處於無錯誤狀態(000)
strm:
:_hardfail//暫時也不清楚是什麼(10000)
對應標誌位的成員函式:以下置位可以理解為對應標誌位有效
s.
eof(
)//s表示乙個流的物件,例如cin;如果s的eofbit置位,則返回ture
s.bad()
//若s的badbit置位,則返回ture
s.fail()
//若s的failbit或badbit置位,則返回ture
s.good()
//若s處於有效狀態,則返回ture
note:badbit被置位時,成員函式fail()也會返回ture,eofbit置位會導致failbit置位,需要注意的是,eofbit在讀取完最後乙個字元後並沒有置位,當下次嘗試讀取乙個字元失敗的時候才會將eofbit和failbit置位,所以用成員函式fail()或good()來確定流的總體狀態是正確的。舉個例子如下:
#include
"stdafx.h"
#include
#include
using namespace std;
int_tmain
(int argc, _tchar* ar**)
system
("pause");
return0;
}
結果如下:
可以看出,第二次輸入ctrl+z(windows7+vs2010,且必須是第乙個字元),就退出了while迴圈(遇到eof)。(c++primer8.1.2練習程式)程式涉及到了ignore()成員函式。while函式檢查表示式返回的流的狀態,把流的狀態當while函式的判斷條件等價於!fail()當判斷條件,只要返回的流的狀態是正常的,就不會停止while迴圈。
下面是乙個io錯誤的例子:
int a;
cin>>a;
當輸入不是整型數時,例如abc,流就會出錯,一旦乙個流發生錯誤,其後續的io操作都會失敗。將乙個流物件作為條件使用while(cin>>a)
,就可以避免使用錯誤狀態的流 。
標誌位置位
s.
setstate
(flags)
//根據給定的flags標誌位,將流s中對應的標誌位置位,flags型別strm::iostate。返回void
標誌位清除
s.
clear()
//將流s中所有狀態位復位,將流的狀態設定為有效。返回void
s.clear
(flags)
//根據給定的flags標誌位,將流s中對應條件狀態位復位。flags型別為strm::iostate。返回void
獲取流狀態
s.
rdstate()
//返回流s的當前條件狀態,返回型別為strm::iostate
成員函式rdstate()一般來說返回的是乙個iostate值(0、1、2、4、16),對應流的當前狀態。但是使用了成員函式setstate(),得到的就不一定是這幾個固定的數,而是所有有效標誌位常量之和。如下:
可以看到,rdstate返回的是6,並不是乙個iostate;接下來是常量:4、2、1、0;接下來是對應標誌位成員函式,1表示被置位。單獨執行cin.setatate(ios::eofbit);
時,cin.fail()
函式不會返回1;單獨執行cin.setstate(ios::badbit);
時,cin.fail()
和cin.bad()
都會返回1;
在查閱資料的過程中,一篇部落格寫的很好,如果還有什麼疑惑的地方,可以參考一下
c io庫條件狀態
badbit 用來指出流已經崩潰,屬於系統級錯誤,如不可恢復的讀寫錯誤。failbit 表示乙個io操作失敗了,比如讀取數字卻讀取的是字元,這是可以恢復的 eofbit 用來表示檔案達到檔案結尾,這也是可以恢復的 goodbit 表示流的狀態正常 注意的是,一但流發生錯誤,其上後續的io操作都會失敗...
C I O庫流狀態標誌位
再來看看輸入狀態標記位 狀態測試函式 狀態設定函式之間的關係 輸入狀態標記位常量有以下幾個 標記位常量 常量 含義 failbit標記位的值 eofbit標記位的值 badbit標記位的值 轉化為10進製 ios failbit 輸入 輸出 流出現非致命錯誤,可挽回 1 0 0 4 ios badb...
C IO類 1 流的介紹和流的狀態
基本io庫型別 istream 輸入流 型別,提供輸入操作 ostream 輸出流 型別,提供輸出操作 cin,乙個istream物件,從標準輸入讀取資料 cout,乙個ostream物件,向標準輸出寫資料 cerr,乙個ostream物件,通常用於輸出程式錯誤資訊,寫入到標準錯誤 用來從乙個ist...