C++流和文件流
C++流和文件流 收藏
?
在程序設(shè)計(jì)中,數(shù)據(jù)輸入/輸出(I/O)操作是必不可少的,C++語(yǔ)言的數(shù)據(jù)輸入/輸出操作是通過(guò)I/O流庫(kù)來(lái)實(shí)現(xiàn)的。C++中把數(shù)據(jù)之間的傳輸操作稱(chēng)為流,流既可以表示數(shù)據(jù)從內(nèi)存?zhèn)魉偷侥硞€(gè)載體或設(shè)備中,即輸出流,也可以表示數(shù)據(jù)從某個(gè)載體或設(shè)備傳送到內(nèi)存緩沖區(qū)變量中,即輸入流。在進(jìn)行I/O操作時(shí),首先是打開(kāi)操作,使流和文件發(fā)生聯(lián)系,建立聯(lián)系后的文件才允許數(shù)據(jù)流入和流出,輸入或輸出結(jié)束后,使用關(guān)閉操作使文件與流斷開(kāi)聯(lián)系。
標(biāo)準(zhǔn)輸入輸出流(cout、cin)在使用過(guò)程中,只要在程序的開(kāi)頭嵌入相應(yīng)的頭文件“iostream.h”即可。
文件的打開(kāi)和關(guān)閉是通過(guò)使用fstream類(lèi)的成員函數(shù)open和close來(lái)實(shí)現(xiàn)的,fstream類(lèi)用來(lái)對(duì)文件流進(jìn)行操作,fstream類(lèi)的頭文件是fstream.h。
1.數(shù)據(jù)的輸出cout
cout是標(biāo)準(zhǔn)輸出設(shè)備即顯示器(默認(rèn)設(shè)備)連接的預(yù)定義輸出流。C++語(yǔ)言的插入運(yùn)算符“<<”向輸出流發(fā)送字符,cout是數(shù)據(jù)的目的地,插入運(yùn)算符“<<”把數(shù)據(jù)傳送到cout。
輸出流對(duì)象cout輸出數(shù)據(jù)的語(yǔ)句格式為:
cout<<數(shù)據(jù)1<<數(shù)據(jù)2<<……<<數(shù)據(jù)n;
其中,“<<”是輸出操作符,用于向cout輸出流中插入數(shù)據(jù)。
在cout中還可以使用流控制符控制數(shù)據(jù)的輸出格式,但要注意使用這些流控制符時(shí),要在程序的開(kāi)始部分嵌入頭文件“iomanip.h”。
常用的流控制符及其功能如下表所示:
表1? I/O流的常用控制符
控制符 功?? 能
Dec 十進(jìn)制數(shù)輸出
Hex 十六進(jìn)制輸出
Oct 八進(jìn)制數(shù)輸出
setfill? 在給定的輸出域?qū)挾葍?nèi)填充字符c
setprecison(n) 設(shè)顯示小數(shù)精度為n位
setw(n) 設(shè)域?qū)挒?/span>n個(gè)字符
setiosflags(ios::fixed) 固定的浮點(diǎn)顯示
setiosflags(ios::scientific) 指數(shù)顯示
setiosflags(ios::left) 左對(duì)齊
setiosflags(ios::right) 右對(duì)齊
setiosflags(ios::skipws) 忽略前導(dǎo)空白
setiosflags(ios::uppercase) 十六進(jìn)制數(shù)大寫(xiě)輸出
setiosflags(ios::lowercase) 十六進(jìn)制數(shù)小寫(xiě)輸出
setiosflags(ios::showbase)
? 當(dāng)按十六進(jìn)制輸出數(shù)據(jù)時(shí),前面顯示前導(dǎo)符0x;當(dāng)按八進(jìn)制輸出數(shù)據(jù)時(shí),前面顯示前導(dǎo)符0
Endl 輸入一個(gè)換行符并刷新流
?
2.數(shù)據(jù)的輸入cin
cin是與標(biāo)準(zhǔn)輸入設(shè)備即鍵盤(pán)(默認(rèn)設(shè)備)連接的預(yù)定義輸入流。它從輸入流中取出數(shù)據(jù),數(shù)據(jù)從輸入提起運(yùn)算符“>>”處流進(jìn)程序。
輸入流對(duì)象cin輸入數(shù)據(jù)的語(yǔ)句格式為:
cin>>變量名1>>變量名2>>……>>變量名n;
其中,“>>”是輸入操作符,用于從cin輸入流中取得數(shù)據(jù),并將取得的數(shù)據(jù)傳送給其后的變量,從而完成輸入數(shù)據(jù)的功能。
注意:“>>”操作符后除了變量名外不得有其他數(shù)字、字符串,否則系統(tǒng)會(huì)報(bào)錯(cuò)。
3.文件流及其有關(guān)的類(lèi)
文件是存儲(chǔ)在磁盤(pán)、磁帶等外部設(shè)備上的數(shù)據(jù)的集合,每一個(gè)文件都必須有一個(gè)唯一的文件名稱(chēng)。在使用文件前必須首先打開(kāi)文件,使用完畢后必須關(guān)閉文件。對(duì)文件的操作是由文件流類(lèi)完成的。文件流類(lèi)在流與文件之間建立連接。下圖是與文件操作相關(guān)的類(lèi)及其繼承關(guān)系。
ios
istream
ostream
ifstream
iostream
ofstream
fstream
?
ios
istream
ostream
ifstream
iostream
ofstream
fstream
?
圖1 幾個(gè)與文件處理相關(guān)的類(lèi)及其繼承關(guān)系結(jié)構(gòu)圖
下表是常用的I/O流類(lèi)庫(kù)的說(shuō)明,以及在編程中需要包含到程序中的頭文件。
表2 常用I/O流類(lèi)庫(kù)說(shuō)明
類(lèi) 名 說(shuō) 明 編程中需要包含的頭文件
ios 流基類(lèi),是抽象類(lèi) ostream.h
istream 通用輸入流類(lèi)和其它輸入流類(lèi)的基類(lèi) iostream.h
ifstream 輸入文件流類(lèi) fstream.h
ostream 通用輸出流類(lèi)和其它輸出流類(lèi)的基類(lèi) iosream.h.
ofstream 輸出文件流類(lèi) fstream.h
iostream 通用I/O流類(lèi)和其它I/O流的基類(lèi) iostream.h
fstream I/O文件流類(lèi) fstream.h
?
4.文件的打開(kāi)與關(guān)閉
對(duì)文件的操作是由文件流類(lèi)完成的。文件流類(lèi)在流與文件間建立連接。由于文件流分為三種:文件輸入流、文件輸出流、文件輸入/輸出流,所以相應(yīng)的必須將文件流說(shuō)明為ifstream、ofstream和fstream類(lèi)的對(duì)象,然后利用文件流的對(duì)象對(duì)文件進(jìn)行操作。
對(duì)文件的操作過(guò)程可按照一下四步進(jìn)行:即定義文件流類(lèi)的對(duì)象、打開(kāi)文件、堆文件進(jìn)行讀寫(xiě)操作、關(guān)閉文件,下面分別進(jìn)行介紹。
(1)定義文件流對(duì)象
利用文件流類(lèi)可以定義文件流類(lèi)對(duì)象,方法是:
文件流類(lèi) 對(duì)象名;
如:
ifstream ifile; //定義一個(gè)文件輸入流對(duì)象
ofstream ofile; //定義一個(gè)文件輸出流對(duì)象
fstream iofile; //定義一個(gè)文件輸出/輸入流對(duì)象
(2)打開(kāi)文件
定義了文件流對(duì)象后,就可以利用其成員函數(shù)open()打開(kāi)需要操作的文件,該成員函數(shù)的函數(shù)原型為:
void open(const unsigned char *filename,int mode,int access=filebuf:openprot);
其中:filename是一個(gè)字符型指針,指定了要打開(kāi)的文件名;mode指定了文件的打開(kāi)方式,其值如下表所示;access指定了文件的系統(tǒng)屬性,其取值為:
0???????? 一般文件
1???????? 只讀文件:
2???????? 隱藏文件
3???????? 系統(tǒng)文件
表3 在ios類(lèi)中定義的文件打開(kāi)方式
文件打開(kāi)方式 含 義
ios::in 以輸入(讀)方式打開(kāi)文件
ios::out 以輸出(寫(xiě))方式打開(kāi)文件
ios::app 打開(kāi)一個(gè)文件使新的內(nèi)容始終添加在文件的末尾
ios::ate 打開(kāi)一個(gè)文件使新的內(nèi)容添加在文件尾,但下次添加時(shí),寫(xiě)在當(dāng)前位置處
ios::trunc 若文件存在,則清除文件所有內(nèi)容;若文件不存在,則創(chuàng)建新文件
ios::binary 以二進(jìn)制方式打開(kāi)文件,缺省時(shí)以文本方式打開(kāi)文件
ios::nocreate 打開(kāi)一個(gè)已有文件,若該文件不存在,則打開(kāi)失敗
ios::noreplace 若打開(kāi)的文件已經(jīng)存在,則打開(kāi)失敗
?
說(shuō)明:
1)在實(shí)際使用過(guò)程中,可以根據(jù)需要將以上打開(kāi)文件的方式用“|”組合起來(lái)。如:
ios::in|ios::out??????????????? 表示以讀/寫(xiě)方式打開(kāi)文件
ios::in|ios:: binary???????????? 表示以二進(jìn)制讀方式打開(kāi)文件
ios::out|ios:: binary??????????? 表示以二進(jìn)制寫(xiě)方式打開(kāi)文件
ios::in|ios::out|ios::binary?????? 表示以二進(jìn)制讀/寫(xiě)方式打開(kāi)文件
2)如果未指明以二進(jìn)制方式打開(kāi)文件,則默認(rèn)是以文本方式打開(kāi)文件。
3)對(duì)于ifstream流,mode參數(shù)的默認(rèn)值為ios::in,對(duì)于ofstream流,mode的默認(rèn)值為ios::out。
(3)文件的關(guān)閉
在文件操作結(jié)束(即讀、寫(xiě)完畢)時(shí)應(yīng)及時(shí)調(diào)用成員函數(shù)close()來(lái)關(guān)閉文件。該函數(shù)比較簡(jiǎn)單,沒(méi)有參數(shù)和返回值。
利用對(duì)象和相應(yīng)的成員函數(shù)對(duì)文件進(jìn)行讀寫(xiě)操作,我們將單獨(dú)介紹。
5.文件的讀寫(xiě)操作
在打開(kāi)文件后就可以對(duì)文件進(jìn)行讀寫(xiě)操作了。從一個(gè)文件中讀出數(shù)據(jù),可以使用文件流類(lèi)的get、getline、read成員函數(shù)以及運(yùn)算符“>>”;而向一個(gè)文件寫(xiě)入數(shù)據(jù),可以使用其put、write函數(shù)以及插入符“<<”,如下表所示:
表4 文件流類(lèi)的文件操作成員函數(shù)
函數(shù)原型 說(shuō) 明
get(char &ch) 從文件中讀取一個(gè)字符
getline(char *pch,int count,char delim=’/n’) 從文件中讀取多個(gè)字符,讀取個(gè)數(shù)有參數(shù)count決定,參數(shù)delim 是讀取字符是指定的結(jié)束符(默認(rèn)為換行字符)
read(char *pch,int count) 從文件中讀取多個(gè)字符,讀取個(gè)數(shù)由參數(shù)counnt決定
put(char ch) 向文件寫(xiě)入一個(gè)字符
write(const char *pch,int count) 向文件寫(xiě)入多個(gè)字符,字符個(gè)數(shù)由count決定
?
順序文件操作:這種操作方式只能從文件的開(kāi)始處依次順序讀寫(xiě)文件內(nèi)容,而不能任意讀寫(xiě)文件內(nèi)容。
從一個(gè)文件中讀出數(shù)據(jù),可以使用get、getline、read成員函數(shù)以及運(yùn)算符“>>”;而向一個(gè)文件寫(xiě)入數(shù)據(jù),可以使用put、write成員函數(shù)以及插入符“<<”。
總結(jié)
- 上一篇: stdarg.h的库函数用法小结
- 下一篇: 巧用Excel 轻松转换人民币大小写