C++流和文件流
C++流和文件流 收藏
?
在程序設計中,數據輸入/輸出(I/O)操作是必不可少的,C++語言的數據輸入/輸出操作是通過I/O流庫來實現的。C++中把數據之間的傳輸操作稱為流,流既可以表示數據從內存傳送到某個載體或設備中,即輸出流,也可以表示數據從某個載體或設備傳送到內存緩沖區變量中,即輸入流。在進行I/O操作時,首先是打開操作,使流和文件發生聯系,建立聯系后的文件才允許數據流入和流出,輸入或輸出結束后,使用關閉操作使文件與流斷開聯系。
標準輸入輸出流(cout、cin)在使用過程中,只要在程序的開頭嵌入相應的頭文件“iostream.h”即可。
文件的打開和關閉是通過使用fstream類的成員函數open和close來實現的,fstream類用來對文件流進行操作,fstream類的頭文件是fstream.h。
1.數據的輸出cout
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 輸入一個換行符并刷新流
?
2.數據的輸入cin
cin是與標準輸入設備即鍵盤(默認設備)連接的預定義輸入流。它從輸入流中取出數據,數據從輸入提起運算符“>>”處流進程序。
輸入流對象cin輸入數據的語句格式為:
cin>>變量名1>>變量名2>>……>>變量名n;
其中,“>>”是輸入操作符,用于從cin輸入流中取得數據,并將取得的數據傳送給其后的變量,從而完成輸入數據的功能。
注意:“>>”操作符后除了變量名外不得有其他數字、字符串,否則系統會報錯。
3.文件流及其有關的類
文件是存儲在磁盤、磁帶等外部設備上的數據的集合,每一個文件都必須有一個唯一的文件名稱。在使用文件前必須首先打開文件,使用完畢后必須關閉文件。對文件的操作是由文件流類完成的。文件流類在流與文件之間建立連接。下圖是與文件操作相關的類及其繼承關系。
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
?
4.文件的打開與關閉
對文件的操作是由文件流類完成的。文件流類在流與文件間建立連接。由于文件流分為三種:文件輸入流、文件輸出流、文件輸入/輸出流,所以相應的必須將文件流說明為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()來關閉文件。該函數比較簡單,沒有參數和返回值。
利用對象和相應的成員函數對文件進行讀寫操作,我們將單獨介紹。
5.文件的讀寫操作
在打開文件后就可以對文件進行讀寫操作了。從一個文件中讀出數據,可以使用文件流類的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成員函數以及插入符“<<”。
總結
- 上一篇: stdarg.h的库函数用法小结
- 下一篇: 巧用Excel 轻松转换人民币大小写