流類庫與輸入輸出 二

2021-05-21 21:14:46 字數 3807 閱讀 2393

如果建構函式或open成員函式開啟了該檔案,輸出流析構函式自動關閉乙個流的檔案。

6.錯誤處理函式

錯誤處理成員函式的作用是在寫到乙個流時進行錯誤處理。各函式及其功能如下表所示。     

錯誤處理成員函式及其功能

函  數 功能及返回值

bad 如果出現乙個不可恢復的錯誤,則返回乙個非0值

fail 如果出現乙個不可恢復的錯誤或乙個預期的條件,例如乙個轉換錯誤或檔案未找到,用返回乙個非0值。在用零參量呼叫clear之後可能經常恢復處理

good 如果沒有錯誤條件(不可恢復的或其他)和沒有設定檔案結尾標誌,則返回乙個非0值

eof 遇到檔案結尾條件,則返回乙個非0值

clear 設定內部錯誤狀態,如果用預設參量呼叫,則清除所有錯誤位

rdstate 返回當前錯誤狀態

! 運算子經過了過載,它與fail函式執行相同的功能,因此表示式if(! cout)等價於 if (cout.fail())。

void*()運算子也是經過過載的,與!運算子相反,因此表示式if(cout)等價於if(! cout.fail())。

void*()運算子不等價於good,因為它不檢測檔案結尾。 

(四)二進位制輸出檔案

最初設計流的目的是用於文字,因此預設的輸出模式是文字方式。在以文字模式輸出時,若遇到換行符(十進位制10),便自動被擴充為回車換行符(十進位制13)。這種自動擴充有時可能出問題,請看下列程式:

#i nclude

int iarray[2]=;

void main()

當執行程式,向檔案中輸出時,10會被自動轉換成13,然而這裡的轉換顯然不是我們需要的。要想解決這一問題,就要採用二進位制模式輸出。使用二進位制模式輸出時,其中所寫的字元是不轉換的。使用二進位制模式輸出到檔案有下列幾種方法,

(1)以通常方式構造乙個流,然後使用setmode成員函式,在檔案開啟後改變模式,例如:

ofstream ofs("test.dat");

ofs.setmode(filebuf::binary);

ofs.write((char*)iarray,4);    //向二進位制檔案中寫入4位元組資料 

(2)使用ofstream建構函式中的模式參量指定二進位制輸出模式,例如:

#i nclude

#i nclude

#i nclude

int iarray[2]=; 

void main() 

(3)使用二進位制操作符代替setmode成員函式:

ofsmyfile.open("filename",iosmode);    //開啟檔案mename

或: ifstream *pmyfile=new ifstream;  //動態建立乙個檔案流物件,獲得物件指標

pmyfile->open("filename",iosmode);  //用物件指標呼叫open函式開啟檔案

(2)在呼叫建構函式建立檔案流物件時指定檔名和模式,在構造過程中開啟該檔案:

ifstream myfile("filename",iosmode); 

(二)使用提取運算子

提取(extraction)運算子(>>)對於所有標準c++資料型別都是預先設計好的,它是從乙個輸入流物件獲取位元組最容易的方法。    

提取運算子(>>)是用於格式化文字輸入的,在提取資料時,以空白符為分隔。如果要輸入一段包含空白符的文字,用提取運算子就很不方便。在這種情況下,可以選擇使用。非格式化輸入成員函式getline,這樣就可以讀乙個包含有空格的文字塊,然後再對其進行分析。另一種方法是派生乙個輸入流類,帶有乙個成員函式如getnexttoken,它呼叫 istream成員提取和格式化字元資料。

前面介紹過的輸出流錯誤處理函式同樣可應用於輸**。在提取中測試錯誤是重要的。

(三)輸入流操縱符

很多操縱符,如setprecision都定義在ios類中,因此可以應用於輸**。但是只有少數幾個操縱符對輸**物件具有實際影響,其中最重要的是進製操縱符dec、oct和hex。

在提取中,hex操縱符可以接收處理各種輸入流格式,例如c、c、0xc、0xc、0xc和 0xc都將被解釋為十進位制數12。任何除0到9、a到f、a到f和x之外的字元都將引起數值變換終止。例如,序列124n5將變換成數值124,並設定ios::fail位。  

(四)輸入流成員函式 

輸**成員函式用於從磁碟檔案中輸入,這些成員函式包括:

&s226;open函式    

&s226;get函式    

&s226;getline函式

&s226;read函式    

&s226;seekg和tellg函式

&s226;close函式    

1.輸入流的open函式

如果要使用乙個輸入檔案流(ifstream),必須在建構函式中或者使用open函式把該流與乙個特定磁碟檔案關聯起來。無論哪種方式,參量是相同的。

當開啟與乙個輸入流關聯的檔案時,通常要指定乙個模式標誌。模式標誌如下表所示,該標誌可以用按位or(|)運算子進行組合。

表  輸入檔案流檔案開啟模式

ios::in    開啟檔案用於輸入(預設)

ios::nocreate   如果檔案不存在,該函式失敗

ios::binary 以二進位制模式(預設模式是文字模式)開啟檔案

注意:如果需要測試檔案是否存在,必須在開啟檔案時指定ios::nocreate模式,然後使用fail成員函式確定:

istream ifile("filename",ios::nocreate);

if (ifile.fail())

//the file does not exist...

2.get函式    

非格式化get函式的功能與提取運算子(>>)很相像,主要的不同點是get函式在讀人資料時包括空白字元,而提取運算子在預設情況下拒絕接受空白字元。

例  get函式應用舉例

#i nclude

void main()    

執行時如果輸入:

abc  xyz  123

則輸出:

abc  xyz  123

3.getline函式

getline成員函式的功能是允許從輸**中讀取多個字元,並且允許指定輸入終止字元(預設值是換行字元),在讀取完成後,從讀取的內容中刪除該終止字元。

例   為輸入流指定乙個終止字元

本程式連續讀人一串字元,直到遇到字元『t』時停止,字元個數最多不超過99個。

#i nclude

void main()

employee;

ifstream is("payroll",ios::binary|ios::nocreate);

if (is)

}    

else

}    

6.輸入流的close函式

close成員函式關閉與乙個輸入檔案流關聯的磁碟檔案。

雖然ifstream類的析構函式可以自動關閉檔案,但是如果需要使用同一流物件開啟另一檔案,則首先要用close函式關閉當前檔案。

四、輸入/輸出流

乙個iostream物件可以是資料的源或目的。兩個重要的i/o流類都是從iostream派生的,它們是fstream和strstream。這些類繼承了前面描述的stream和ostream類的功能。

fstream類支援磁碟檔案的輸入和輸出。如果你需要在同乙個程式中從乙個特定磁碟檔案讀和寫到該磁碟檔案,可以構造乙個fstream物件。乙個istream物件是有兩個邏輯子流的單個流,兩個子流乙個用於輸入,另乙個用於輸出。詳細說明請讀者參考聯機幫助或執行庫參考手冊。 

流類庫與輸入 輸出

流類庫與輸入 輸出 11 1 什麼叫做流?流的提取和插入是指什麼?i o流在c 中起著怎樣的作用?解 流是一種抽象,它負責在資料的生產者和資料的消費者之間建立聯絡,並管理資料的流動,一般意義下的讀操作在流資料抽象中被稱為 從流中 提取,寫操作被稱為 向流中 插入。作業系統是將鍵盤 螢幕 印表機和通訊...

流類庫與輸入 輸出

引用自 i o流的概念 當程式與外界環境進行資訊交換時,存在著兩個物件,乙個是程式中的物件,另乙個是檔案物件,流是一種抽象,它負責在資料的生產者和資料的消費者之間建立連線,並管理資料的流動。程式建立乙個流物件,並指定這個流物件與某個檔案物件建立連線,程式操作流物件,流物件通過檔案系統對所連線的檔案物...

c 流類庫與輸入輸出

c與c 輸入輸出對比 c中的printf函式只能輸出系統預定義的型別,而c 可以輸入輸出標準型別和自定義型別的資料。優點 可以防止格式控制符輸入輸出型別資料不一致的錯誤 可以通過過載的方式對自定義的資料進行輸入輸出。c 的輸入輸出流 流是指資料從乙個源流到乙個目的流,負責資料的源到目的的之間建立聯絡...