C++中的檔案輸入/輸出(4):檢測輸入/輸出的狀態標誌 (轉)

worldblog發表於2008-01-11
C++中的檔案輸入/輸出(4):檢測輸入/輸出的狀態標誌 (轉)[@more@]

C++中的輸入/輸出(4):namespace prefix = o ns = "urn:schemas--com::office" />

原作:Ilia Yordanov,  to:loobian@cpp-home.com">loobian@cpp-home.com

檢測輸入/輸出的狀態標誌

在此我不打算解釋“標誌(flags)”一詞的含義,不過假如你真的完全不理解關於這方面的概念,那麼將本章讀過一遍之後也許你對此會得到一些認識,我也相信你同樣能理解這部分的理論。儘管如此,如果你還是不明白標誌在C++中的含義,我推薦你閱讀一些關於這個主題的資料。

好,讓我們開始吧。

C++中負責的輸入/輸出的包括了關於每一個輸入/輸出操作的結果的記錄資訊。這些當前的狀態資訊被包含在io_state型別的中。io_state是一個列舉型別(就像open_mode一樣),以下便是它包含的值(譯註:表中第一列為列舉值的名稱,第二列為該值相應含義的描述):

goit

無錯誤

Eofbit

已到達檔案尾

failbit

非致命的輸入/輸出錯誤

badbit

致使的輸入/輸出錯誤

有兩種方法可以獲得輸入/輸出的狀態資訊。一種方法是透過rdstate(),它將返回當前狀態的錯誤標記(上表中提到的)。例如,假如沒有任何錯誤,則rdstate()會返回goodbit.

另一種方法則是使用下面任何一個函式來檢測相應的輸入/輸出狀態:

bool bad();

bool eof(); //還記得它麼?“不斷讀取檔案內容直到到達檔案末尾!”

bool fail(); //噢,這也是老朋友……檢測一個開啟操作是否成功

bool good();

假如badbit標誌被標設(譯註:原文為“If the badbit flag is up”,這裡將“is up”譯為“標設”,意即出現了badbit對應的錯誤,badbit狀態被置為當前的錯誤狀態,下同),則bad()函式返回true;假如failbit標誌被標設,則fail()函式返回true;假如沒有錯誤發生(goodbit標誌被標設),則good()函式返回true;假如操作已經到達了檔案末尾(eofbit被標設),則eof()函式返回true.

如果錯誤發生,你必須清除這些錯誤狀態,以使你的能正確適當地繼續執行——如果你這麼打算的話。要清除錯誤狀態,需使用clear()函式。此函式帶一個引數,它是你將要設為當前狀態的標誌值。假使你想讓你的程式“清清爽爽”地執行下去,只要將ios::goodbit作為實參。你將在以下內容中看到示例程式碼。

我將向你展示示例程式碼,以鞏固你所學到的理論知識。

示例1:簡單的狀態檢測

// 實際應用中可將 FileStream替換成你相應在使用的檔案流控制程式碼

  if(FileStream.rdstate() == ios::eofbit)

  cout << "End of file!n";

  if(FileStream.rdstate() == ios::badbit)

  cout << "al I/O error!n";

  if(FileStream.rdstate() == ios::failbit)

  cout << "Non-fatal I/O error!n";

  if(FileStream.rdstate() == ios::goodbit)

cout << "No errors!n";

示例2:clear()函式

#include

 

void main()

{

  ofstream File1("file2.txt"); //建立file2.txt

  File1.close();

 

  // 下面的檢測程式碼將會返回錯誤,這是因為我使用了ios::noreplace開啟

  // 它模式在試圖開啟一個已存在的檔案時會返回錯誤

  ofstream Test("file2.txt",ios::noreplace);

 

  // 上一行將導致ios::failbit錯誤,我們這就將其演示出來

  if(Test.rdstate() == ios::failbit)

  cout << "Error...!n";

 

  Test.clear(ios::goodbit); // 將當前狀態重置為ios::goodbit

 

  if(Test.rdstate() == ios::goodbit) // 檢測程式是否已經正確地施行了設定

  cout << "Fine!n";

 

  Test.clear(ios::eofbit); // 將狀態標誌設為ios::eofbit. 無實際用途.

 

  if(Test.rdstate() == ios::eofbit) // 檢測是否已經正確地施行了設定  cout << "EOF!n";

 

  Test.close();

 

}

除了使用標記值判斷,你也可以使用函式(譯註:指bad()、eof()、fail()、good()這些函式)的形式進行判斷,兩者實際上是一樣的——都是檢測某個標記是否被標設。這些函式前面已經介紹過,我就不再重複了。如果你對如何使用它們還不是十分確定,那就重新回顧一下本教程中我曾經為你演示的應該如何檢測一個檔案開啟操作是否成功的那部分內容。在那裡我就使用了fail()函式。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-997107/,如需轉載,請註明出處,否則將追究法律責任。

相關文章