C++中的文件輸入/輸出(4)
原作:Ilia Yordanov, loobian@cpp-home.com
檢測(cè)輸入/輸出的狀態(tài)標(biāo)志
在此我不打算解釋“標(biāo)志(flags)”一詞的含義,不過假如你真的完全不理解關(guān)于這方面的概念,那么將本章讀過一遍之后也許你對(duì)此會(huì)得到一些認(rèn)識(shí),我也相信你同樣能理解這部分的理論。盡管如此,如果你還是不明白標(biāo)志在C++中的含義,我推薦你閱讀一些關(guān)于這個(gè)主題的資料。
好,讓我們開始吧。
C++中負(fù)責(zé)的輸入/輸出的系統(tǒng)包括了關(guān)于每一個(gè)輸入/輸出操作的結(jié)果的記錄信息。這些當(dāng)前的狀態(tài)信息被包含在io_state類型的對(duì)象中。io_state是一個(gè)枚舉類型(就像open_mode一樣),以下便是它包含的值(譯注:表中第一列為枚舉值的名稱,第二列為該值相應(yīng)含義的描述):
godbit | 無錯(cuò)誤 |
Eofbit | 已到達(dá)文件尾 |
failbit | 非致命的輸入/輸出錯(cuò)誤 |
badbit | 致使的輸入/輸出錯(cuò)誤 |
有兩種方法可以獲得輸入/輸出的狀態(tài)信息。一種方法是通過調(diào)用rdstate()函數(shù),它將返回當(dāng)前狀態(tài)的錯(cuò)誤標(biāo)記(上表中提到的)。例如,假如沒有任何錯(cuò)誤,則rdstate()會(huì)返回goodbit.
另一種方法則是使用下面任何一個(gè)函數(shù)來檢測(cè)相應(yīng)的輸入/輸出狀態(tài):
bool bad();
bool eof(); //還記得它么?“不斷讀取文件內(nèi)容直到到達(dá)文件末尾!”
bool fail(); //噢,這也是老朋友……檢測(cè)一個(gè)打開操作是否成功
bool good();
假如badbit標(biāo)志被標(biāo)設(shè)(譯注:原文為“If the badbit flag is up”,這里將“is up”譯為“標(biāo)設(shè)”,意即出現(xiàn)了badbit對(duì)應(yīng)的錯(cuò)誤,badbit狀態(tài)被置為當(dāng)前的錯(cuò)誤狀態(tài),下同),則bad()函數(shù)返回true;假如failbit標(biāo)志被標(biāo)設(shè),則fail()函數(shù)返回true;假如沒有錯(cuò)誤發(fā)生(goodbit標(biāo)志被標(biāo)設(shè)),則good()函數(shù)返回true;假如操作已經(jīng)到達(dá)了文件末尾(eofbit被標(biāo)設(shè)),則eof()函數(shù)返回true.
如果錯(cuò)誤發(fā)生,你必須清除這些錯(cuò)誤狀態(tài),以使你的程序能正確適當(dāng)?shù)乩^續(xù)運(yùn)行——如果你這么打算的話。要清除錯(cuò)誤狀態(tài),需使用clear()函數(shù)。此函數(shù)帶一個(gè)參數(shù),它是你將要設(shè)為當(dāng)前狀態(tài)的標(biāo)志值。假使你想讓你的程序“清清爽爽”地運(yùn)行下去,只要將ios::goodbit作為實(shí)參。你將在以下內(nèi)容中看到示例代碼。
我將向你展示示例代碼,以鞏固你所學(xué)到的理論知識(shí)。
示例1:簡(jiǎn)單的狀態(tài)檢測(cè)
// 實(shí)際應(yīng)用中可將 FileStream替換成你相應(yīng)在使用的文件流句柄
if(FileStream.rdstate() == ios::eofbit)
cout << "End of file!\n";
if(FileStream.rdstate() == ios::badbit)
cout << "Fatal 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()函數(shù)
#include <fstream.h>
void main()
{
ofstream File1("file2.txt"); //建立file2.txt
File1.close();
// 下面的檢測(cè)代碼將會(huì)返回錯(cuò)誤,這是因?yàn)槲沂褂昧?/span>ios::noreplace打開模式
// 它模式在試圖打開一個(gè)已存在的文件時(shí)會(huì)返回錯(cuò)誤
ofstream Test("file2.txt",ios::noreplace);
// 上一行將導(dǎo)致ios::failbit錯(cuò)誤,我們這就將其演示出來
if(Test.rdstate() == ios::failbit)
cout << "Error...!\n";
Test.clear(ios::goodbit); // 將當(dāng)前狀態(tài)重置為ios::goodbit
if(Test.rdstate() == ios::goodbit) // 檢測(cè)程序是否已經(jīng)正確地施行了設(shè)置
cout << "Fine!\n";
Test.clear(ios::eofbit); // 將狀態(tài)標(biāo)志設(shè)為ios::eofbit. 無實(shí)際用途.
if(Test.rdstate() == ios::eofbit) // 檢測(cè)是否已經(jīng)正確地施行了設(shè)置 cout << "EOF!\n";
Test.close();
}
除了使用標(biāo)記值判斷,你也可以使用函數(shù)(譯注:指bad()、eof()、fail()、good()這些函數(shù))的形式進(jìn)行判斷,兩者實(shí)際上是一樣的——都是檢測(cè)某個(gè)標(biāo)記是否被標(biāo)設(shè)。這些函數(shù)前面已經(jīng)介紹過,我就不再重復(fù)了。如果你對(duì)如何使用它們還不是十分確定,那就重新回顧一下本教程中我曾經(jīng)為你演示的應(yīng)該如何檢測(cè)一個(gè)文件打開操作是否成功的那部分內(nèi)容。在那里我就使用了fail()函數(shù)。
聯(lián)系客服