C++的文件操作
很多人在C++編程中習(xí)慣使用ANSI C下的文件類型指針FILE來(lái)執(zhí)行文件的有關(guān)操作,這難免影響C++程序的總體美觀性。另外,C++標(biāo)準(zhǔn)IO庫(kù)中提供了更為完善、易用的文件操作方法,所以建議使用標(biāo)準(zhǔn)庫(kù)來(lái)實(shí)現(xiàn)文件的輸入/輸出,培養(yǎng)一種好的編程習(xí)慣。
1.文件的輸入輸出
文件操作的頭文件有:ifstream提供文件讀取功能;ofstream提供文件寫(xiě)入功能;fstream提供文件的讀寫(xiě)功能(包括了前兩類的功能,實(shí)現(xiàn)對(duì)同一文件的讀寫(xiě)雙操作)。
a.定義對(duì)象
b.在使用fstream對(duì)象之前,還必須使這些對(duì)象綁定要讀寫(xiě)的文件
infile.open ("in.txt"); //要輸入in.txt文件 outfile.open ("out.txt"); //要輸出out.txt文件當(dāng)然,fstream類提供了構(gòu)造函數(shù),可以在定義對(duì)象時(shí)初始化實(shí)現(xiàn)上述兩步
ifstream infile ("in.txt"); //定義infile對(duì)象,輸入in.txt文件內(nèi)容 ofstream outfile ("out.txt"); //定義outfile對(duì)象,輸出內(nèi)容到out.txt文件c.檢查文件打開(kāi)是否成功
if (!infile) { cout << "error: unable to open the file" << endl;return -1; }d.文件內(nèi)容的處理
I.成員函數(shù)eof()用來(lái)檢測(cè)是否到達(dá)文件尾,如果到達(dá)文件尾返回非0值,否則返回0
II.文件分為文本文件和二進(jìn)制文件,對(duì)文本文件的處理比較簡(jiǎn)單,用插入器和析取器就可以了;而對(duì)于二進(jìn)制的處理要復(fù)雜些,下要分別介紹這兩種方式
文本文件:用插入器(<<)向文件輸出;用析取器(>>)從文件輸入。假設(shè)infile以輸入方式打開(kāi),outfile以輸出打開(kāi)
這種方式還有一種簡(jiǎn)單的格式化能力,比如可以指定輸出為16進(jìn)制等等
| 操縱符 | 功能 | 輸入/輸出 |
| dec | 格式化為十進(jìn)制數(shù)值數(shù)據(jù) | 輸入和輸出 |
| hex | 格式化為十六進(jìn)制數(shù)值數(shù)據(jù) | 輸入和輸出 |
| oct | 格式化為八進(jìn)制數(shù)值數(shù)據(jù) | 輸入和輸出 |
| setpxecision(int p) | 設(shè)置浮點(diǎn)數(shù)的精度位數(shù) | 輸出 |
| endl | 輸出一個(gè)換行符并刷新此流 | 輸出 |
| ends | 輸出一個(gè)空字符 | 輸出 |
比如要把123當(dāng)作十六進(jìn)制輸出:outfile<<hex<<123;要把3.1415926以5位精度輸出:outfile<<setpxecision(5)<<3.1415926
getline函數(shù),輸入文件的一行,函數(shù)原型
從 is 中讀取字符串存入 str 中,直到遇到分隔符delim為止。對(duì)于第二種形式,getline遇到 '\n’ 停止。執(zhí)行過(guò)程中,如果delim出現(xiàn),它會(huì)被讀取并丟棄,下次輸入將在它之后開(kāi)始。
二進(jìn)制文件:put()函數(shù)向流寫(xiě)入一個(gè)字符,其原型是ofstream &put(char ch),使用也比較簡(jiǎn)單,如outfile.put('c');就是向流寫(xiě)一個(gè)字符'c'。
get()函數(shù)比較靈活,有3種常用的重載形式:
一種就是和put()對(duì)應(yīng)的形式:ifstream &get(char &ch);功能是從流中讀取一個(gè)字符,結(jié)果保存在引用ch中,如果到文件尾,返回空字符。如infile.get(x);表示從文件中讀取一個(gè)字符,并把讀取的字符保存在x中。
另一種重載形式的原型是: int get();這種形式是從流中返回一個(gè)字符,如果到達(dá)文件尾,返回EOF,如x=file2.get();和上例功能是一樣的。
還有一種形式的原型是:ifstream &get(char *buf,int num,char delim=' ');這種形式把字符讀入由 buf 指向的數(shù)組,直到讀入了 num 個(gè)字符或遇到了由 delim 指定的字符,如果沒(méi)使用 delim 這個(gè)參數(shù),將使用缺省值換行符' '。
讀寫(xiě)二進(jìn)制數(shù)據(jù)塊,要使用成員函數(shù)read()和write()成員函數(shù),它們?cè)腿缦?#xff1a;
III.文件的定位,C++的文件定位分為讀位置和寫(xiě)位置的定位,對(duì)應(yīng)的成員函數(shù)是 seekg()和 seekp(),seekg()是設(shè)置讀位置,seekp是設(shè)置寫(xiě)位置。它們最通用的形式如下:
istream &seekg (streamoff offset, seek_dir origin); ostream &seekp (streamoff offset, seek_dir origin);offset定義了偏移量,seek_dir 表示移動(dòng)的基準(zhǔn)位置,是一個(gè)有以下值的枚舉:
ios::beg: 文件開(kāi)頭
ios::cur: 文件當(dāng)前位置
ios::end: 文件結(jié)尾
這兩個(gè)函數(shù)一般用于二進(jìn)制文件(字節(jié)),因?yàn)槲谋疚募?huì)因?yàn)橄到y(tǒng)對(duì)字符的解釋而可能與預(yù)想的值不同。
e.文件關(guān)閉
程序結(jié)束或fstream對(duì)象與另一文件關(guān)聯(lián)時(shí),必須先關(guān)閉現(xiàn)在的文件。
2.文件模式
在打開(kāi)文件時(shí),無(wú)論是調(diào)用open還是以文件名作為流初始化的一部分,都需要指定文件模式。文件流構(gòu)造函數(shù)和open函數(shù)都提供了默認(rèn)參數(shù)來(lái)設(shè)置文件模式,默認(rèn)值因流類型的不同而不同。常用的文件模式與含義如下:
| 文件模式 | 含義 |
| in | 打開(kāi)文件作讀操作 |
| out | 打開(kāi)文件作寫(xiě)操作 |
| app | 在每次寫(xiě)之前找到文件尾 |
| ate | 打開(kāi)文件時(shí)把文件定位在文件尾 |
| trunc | 打開(kāi)文件時(shí)清空已存在的文件流 |
| binary | 以二進(jìn)制模式進(jìn)行IO操作 |
以binary模式打開(kāi)的流將文件以字節(jié)序列的形式處理,而不解釋流中的字符。
默認(rèn)情況下,與ifstream流對(duì)相關(guān)聯(lián)的文件以in模式打開(kāi),與ofstream關(guān)聯(lián)文件以out模式打開(kāi)。以out模式打開(kāi)的文件會(huì)被清空,丟棄該文件存儲(chǔ)的所有數(shù)據(jù),從效果來(lái)看,為ofstream對(duì)象指定out模式等效于指定了out和trunc模式。
模式的組合,多個(gè)文件模式可以同時(shí)指定,但是有些組合是沒(méi)有意義的,常見(jiàn)的組合模式如下
| 組合模式 | 含義 |
| out | app | 打開(kāi)文件做寫(xiě)操作,文件尾寫(xiě)入 |
| out | trunc | 打開(kāi)文件做寫(xiě)操作,刪除文件已有數(shù)據(jù)(與out相同) |
| in | out | 打開(kāi)文件做讀、寫(xiě)操作,定位到文件開(kāi)頭處 |
| in | out | trunc | 打開(kāi)文件做讀、寫(xiě)操作,刪除文件中已有數(shù)據(jù) |
| in | out | ate | 打開(kāi)文件做讀、寫(xiě)操作,定位到文件末尾處 |
| …… | …… |
總結(jié)
- 上一篇: vi/vim 光标移动命令
- 下一篇: 隐马尔科夫模型(Hidden Marko