流的狀態可以通過檢測ios_base類中的位來判斷。
1)當輸入流遇到文件尾時, eofbit位將被設置。
可以調用函數 cin.eof()來判斷是否到達文件末尾
在cin中遇到問價末尾時返回true,否則返回false。
2)當在流中發生格式錯誤時,failbit位將被設置。
例如程序要求輸入整數,但是在輸入流中有非整數的字符的情況。在遇到這種錯誤時,這些字符不會丟失。
成員函數fail將報告流操作失敗了,通常這種錯誤是可以恢復的。
3)當發生數據丟失時,將會設置badbit位。
成員函數bad將報告流操作是否失敗了。一般情況下,這種嚴重的錯誤是不能修復的。
4)如果流中的eofbit、failbit 和 badbit位都沒有被設置,那么goodbit位將被設置
即如果函數eof, fail 和 bad都返回false值,則成員函數good返回true值。I/O操作只在“好的”流中才能進行。
5)成員函數rdstate返回流中的錯誤狀態。
例如,通過調用cout.rdstate返回流的狀態,然后通過switch語句檢查eofbit、badbit、failbit 和 goodbit來檢查這些狀態。
檢測流狀態的首選方法是使用成員函數eof, fial, bad 和 good, 使用這些函數不要求了解具體的狀態位。
6)clear成員函數將流的狀態重置為“好的”,使得流可以繼續執行I/O操作。
clear函數的默認參數是goodbit所以語句
cin.clear()
清空了cin, 並且為該流設置goodbit位。
語句cin.clear(ios::failbit)則為流設置failbit位。
注意:
如果failbit位 和 badbit位其中至少一個被設置, 則basic_ios的成員函數operator!返回true;operator void*返回false值(0)
示例代碼:
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int integerValue;
cout<<"Before a bad input operation:"
<<"\ncin.rdstate():"<<cin.rdstate()
<<"\ncin.eof():"<<cin.eof()
<<"\ncin.fail():"<<cin.fail()
<<"\ncin.bad():"<<cin.bad()
<<"\ncin.good():"<<cin.good()
<<"\n\nExpects an integer, but enter a character:";
cin>>integerValue;
cout<<endl;
cout<<"After a bad input operation:"
<<"\ncin.rdstate():"<<cin.rdstate()
<<"\ncin.eof():"<<cin.eof()
<<"\ncin.fail():"<<cin.fail()
<<"\ncin.bad():"<<cin.bad()
<<"\ncin.good():"<<cin.good()<<endl<<endl;
cin.clear();
cout<<"After cin.clear()"<<"\ncin.fail():"<<cin.fail()
<<"\ncin.good():"<<cin.good()<<endl;
return 0;
}