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