C++中流的錯誤狀態 --eof、fail、bad、good、rdstate


流的狀態可以通過檢測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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM