寫程序時想要用 cin 對輸入的合法性檢查,於是學習了一下 cin.fail() 函數,順便學習了類似的一些函數。
cin 對象包含了一個描述流狀態的數據成員。流狀態有 3 個標志位:eofbit,badbit 和 failbit。
當 cin 操作到達文件末尾時,eofbit 置 1。
當流被破壞時,badbit 置 1。例如:試圖讀取不可訪問的文件、寫入寫保護的磁盤、寫入的設備剩余空間不足等。
cin 操作未能讀取到預期的字符時 failbit 會置 1。例如:要輸入到一個整型變量中,輸入的卻是字符時 failbit 置 1。I/O 失敗時 failbit 也可能置 1。
如果 3 個狀態位都為 0 表示一切順利。
下面介紹一些檢查或改變流狀態的方法。
- eof()
如果 eofbit 為 1 返回 true。
所以可以用 cin.eof()
來判斷是否讀到文件尾。
- good()
如果流可以使用,也就是 3 個狀態位都為 0,返回 true。
只有 cin.good()
為 true 時,while(cin >> input)
才返回 true。
- bad()
如果 badbit 為 1 返回 true。
- fail()
如果 failbit 或 badbit 為 1 返回 true。所以與 bad() 一樣的情況會返回 true,輸入一個類型不匹配的字符也是返回 true。
可用於檢查輸入是否合法。
int a;
cin >> a;
if(cin.fail()) {
cout << "Input error" << endl;
}
注意:如果輸入不合法重新輸入,failbit 是不會自動重置的。
- rdstate()
返回流狀態。
- clear(iostate s)
狀態位置位后不會改變。因此要重置狀態位需使用 clear(iostate s)。該方法將所有的狀態位都設置為 s,其中 s 默認為 0。也就是 clear() 將所有狀態位清零。