1. 程式人生 > >C++流和檔案流

C++流和檔案流

在程式設計中,資料輸入/輸出(I/O)操作是必不可少的,C++語言的資料輸入/輸出操作是通過I/O流庫來實現的。C++中把資料之間的傳輸操作稱為流,流既可以表示資料從記憶體傳送到某個載體或裝置中,即輸出流,也可以表示資料從某個載體或裝置傳送到記憶體緩衝區變數中,即輸入流。在進行I/O操作時,首先是開啟操作,使流和檔案發生聯絡,建立聯絡後的檔案才允許資料流入和流出,輸入或輸出結束後,使用關閉操作使檔案與流斷開聯絡。

標準輸入輸出流(cout、cin)在使用過程中,只要在程式的開頭嵌入相應的標頭檔案“iostream.h”即可。 檔案的開啟和關閉是通過使用fstream類的成員函式open和close來實現的,fstream類用來對檔案流進行操作,fstream類的標頭檔案是fstream.h。 cout是標準輸出裝置即顯示器(預設裝置)連線的預定義輸出流。C++語言的插入運算子“<<”向輸出流傳送字元,cout是資料的目的地,插入運算子“<<”把資料傳送到cout。 輸出流物件cout輸出資料的語句格式為: cout<<資料1<<資料2<<……<<資料n; 其中,“<<”是輸出操作符,用於向cout輸出流中插入資料。 在cout中還可以使用流控制符控制資料的輸出格式,但要注意使用這些流控制符時,要在程式的開始部分嵌入標頭檔案“iomanip.h”。 常用的流控制符及其功能如下表所示: 表1  I/O流的常用控制符
Dec 十進位制數輸出
Hex 十六進位制輸出
Oct 八進位制數輸出
setfill© 在給定的輸出域寬度內填充字元c
setprecison(n) 設顯示小數精度為n位
setw(n) 設域寬為n個字元
setiosflags(ios::fixed) 固定的浮點顯示
setiosflags(ios::scientific) 指數顯示
setiosflags(ios::left) 左對齊
setiosflags(ios::right) 右對齊
setiosflags(ios::skipws) 忽略前導空白
setiosflags(ios::uppercase) 十六進位制數大寫輸出
setiosflags(ios::lowercase) 十六進位制數小寫輸出
setiosflags(ios::showbase) 當按十六進位制輸出資料時,前面顯示前導符0x;當按八進位制輸出資料時,前面顯示前導符0
Endl 輸入一個換行符並重新整理流
cin是與標準輸入裝置即鍵盤(預設裝置)連線的預定義輸入流。它從輸入流中取出資料,資料從輸入提起運算子“>>”處流程序序。 輸入流物件cin輸入資料的語句格式為: cin>>變數名1>>變數名2>>……>>變數名n; 其中,“>>”是輸入操作符,用於從cin輸入流中取得資料,並將取得的資料傳送給其後的變數,從而完成輸入資料的功能。 注意:“>>”操作符後除了變數名外不得有其他數字、字串,否則系統會報錯。 檔案是儲存在磁碟、磁帶等外部裝置上的資料的集合,每一個檔案都必須有一個唯一的檔名稱。在使用檔案前必須首先開啟檔案,使用完畢後必須關閉檔案。對檔案的操作是由檔案流類完成的。檔案流類在流與檔案之間建立連線。下圖是與檔案操作相關的類及其繼承關係。
ios
istream
ostream
ifstream
iostream
ofstream
fstream

ios

istream

ostream

ifstream

iostream

ofstream

fstream

圖1 幾個與檔案處理相關的類及其繼承關係結構圖 下表是常用的I/O流類庫的說明,以及在程式設計中需要包含到程式中的標頭檔案。 表2 常用I/O流類庫說明
程式設計中需要包含的標頭檔案
ios 流基類,是抽象類 ostream.h
istream 通用輸入流類和其它輸入流類的基類 iostream.h
ifstream 輸入檔案流類 fstream.h
ostream 通用輸出流類和其它輸出流類的基類 iosream.h.
ofstream 輸出檔案流類 fstream.h
iostream 通用I/O流類和其它I/O流的基類 iostream.h
fstream I/O檔案流類 fstream.h
對檔案的操作是由檔案流類完成的。檔案流類在流與檔案間建立連線。由於檔案流分為三種:檔案輸入流、檔案輸出流、檔案輸入/輸出流,所以相應的必須將檔案流說明為ifstream、ofstream和fstream類的物件,然後利用檔案流的物件對檔案進行操作。 對檔案的操作過程可按照一下四步進行:即定義檔案流類的物件、開啟檔案、堆檔案進行讀寫操作、關閉檔案,下面分別進行介紹。 (1)定義檔案流物件 利用檔案流類可以定義檔案流類物件,方法是: 檔案流類 物件名; 如: ifstream ifile; //定義一個檔案輸入流物件 ofstream ofile; //定義一個檔案輸出流物件 fstream iofile; //定義一個檔案輸出/輸入流物件 (2)開啟檔案 定義了檔案流物件後,就可以利用其成員函式open()開啟需要操作的檔案,該成員函式的函式原型為: void open(const unsigned char *filename,int mode,int access=filebuf:openprot); 其中:filename是一個字元型指標,指定了要開啟的檔名;mode指定了檔案的開啟方式,其值如下表所示;access指定了檔案的系統屬性,其取值為: 0         一般檔案 1         只讀檔案: 2         隱藏檔案 3         系統檔案 表3 在ios類中定義的檔案開啟方式
檔案開啟方式
ios::in 以輸入(讀)方式開啟檔案
ios::out 以輸出(寫)方式開啟檔案
ios::app 開啟一個檔案使新的內容始終新增在檔案的末尾
ios::ate 開啟一個檔案使新的內容新增在檔案尾,但下次新增時,寫在當前位置處
ios::trunc 若檔案存在,則清除檔案所有內容;若檔案不存在,則建立新檔案
ios::binary 以二進位制方式開啟檔案,預設時以文字方式開啟檔案
ios::nocreate 開啟一個已有檔案,若該檔案不存在,則開啟失敗
ios::noreplace 若開啟的檔案已經存在,則開啟失敗
說明: 1)在實際使用過程中,可以根據需要將以上開啟檔案的方式用“|”組合起來。如: ios::in|ios::out                表示以讀/寫方式開啟檔案 ios::in|ios:: binary             表示以二進位制讀方式開啟檔案 ios::out|ios:: binary            表示以二進位制寫方式開啟檔案 ios::in|ios::out|ios::binary       表示以二進位制讀/寫方式開啟檔案 2)如果未指明以二進位制方式開啟檔案,則預設是以文字方式開啟檔案。 3)對於ifstream流,mode引數的預設值為ios::in,對於ofstream流,mode的預設值為ios::out。 (3)檔案的關閉 在檔案操作結束(即讀、寫完畢)時應及時呼叫成員函式close()來關閉檔案。該函式比較簡單,沒有引數和返回值。 利用物件和相應的成員函式對檔案進行讀寫操作,我們將單獨介紹。 在開啟檔案後就可以對檔案進行讀寫操作了。從一個檔案中讀出資料,可以使用檔案流類的get、getline、read成員函式以及運算子“>>”;而向一個檔案寫入資料,可以使用其put、write函式以及插入符“<<”,如下表所示: 表4 檔案流類的檔案操作成員函式
函式原型
get(char &ch) 從檔案中讀取一個字元
getline(char *pch,int count,char delim=’/n’) 從檔案中讀取多個字元,讀取個數有引數count決定,引數delim 是讀取字元是指定的結束符(預設為換行字元)
read(char *pch,int count) 從檔案中讀取多個字元,讀取個數由引數counnt決定
put(char ch) 向檔案寫入一個字元
write(const char *pch,int count) 向檔案寫入多個字元,字元個數由count決定
順序檔案操作:這種操作方式只能從檔案的開始處依次順序讀寫檔案內容,而不能任意讀寫檔案內容。 從一個檔案中讀出資料,可以使用get、getline、read成員函式以及運算子“>>”;而向一個檔案寫入資料,可以使用put、write成員函式以及插入符“<<”。