文件輸入輸出
一、關鍵點
頭文件 fstream 定義了三個類型來支持文件IO:ifstream、ofstream、fstream
其實上面三個類型就是類,這些類為了管理與流關聯的文件,而定義了好多相關的操作:
操作 | 說明 | 示例 |
(i/o)fstream io | 創建一個未綁定的文件流io | ifstream in; |
(i/o)fstream io(file) | 基於上面的基礎,打開名為file的文件,將文件流io與file綁定起來 | ifstream input("data.txt"); |
(i/o)fstream io(file, mode) | 基於上面的基礎,但按指定的mode打開文件 | ofstream out("data.txt", ofstream::app) |
io.open(file) | 打開名為file的文件,並將文件與io綁定 | string s(data.txt); in.open(s); |
io.close() | 關閉與io綁定的文件 | in.close(); |
io.is_open() | 判斷與io關聯的文件是否成功打開並且尚未關閉 | 略 |
接受一個 iostream 類型引用(或指針)參數的函數,可以用一個對應的fstream(或sstream)類型來調用(繼承類的對象可以替代基類的對象)。
二、相關操作
1. 創建文件流對象
- ifstream in; //構造一個輸入文件流in,但並未關聯到任何文件(即空文件流對象)
- ifstream in(ifile); //構造一個 ifstream 對象並打開給定文件
- ofstream out; //輸出文件流未與任何文件相關聯
2. 可以調用open將空文件流對象與文件關聯起來
- ofstream out;
- out.open(ifile + ".copy"); //打開指定文件
註:如果構造文件流時就提供了文件名,那麽open會自動被調用
3. 檢查open是否成功
如果調用 open 失敗,failbit 會被置位(即一個IO操作失敗的意思):
- if (out) //如果open失敗,條件會為假
4. 對一個已經打開的文件流調用open
一個文件流已經打開,它就保持與對應文件的關聯,故“對一個已經打開的文件流調用open”會失敗,並會導致failbit 被置位。
如果我們要將文件流關聯到另外一個文件,必須首先關閉已經關聯的文件,關閉後,才可以關聯新的文件。
- in.close(); //關閉文件
- in.open(ifile + "2"); //打開另一個文件
5. 自動析構
當構造的文件流是局部對象時,它離開其作用域時(即fstream對象被銷毀),與之關聯的文件會自動關閉(即close會自動被調用)。
三、文件模式
每個流都有一個關聯的文件模式(file mode),用來指出如何使用文件。
文件模式 | 說明 |
in | 以讀方式打開 |
out | 以寫方式打開 |
trunc | 截斷文件 |
app | 每次寫操作前均定位到文件末尾 |
ate | 打開文件後立即定位到文件末尾 |
binary | 以二進制方式進行IO |
無論用open方式或初始化流方式來打開文件,我們都可以指定文件模式。
1. 指定文件模式的限制
即使我們沒有指定trunc,以out模式打開的文件也會被截斷(即文件內容沒了),為了保留以out 模式打開的文件的內容,我們必須同時指定app模式(也可以是in模式)
只要trunc沒被設定,就可以設定app模式(在此模式下,即使沒有指定out,文件也以輸出方式被打開)
2. 默認文件模式
與輸入文件流關聯的文件默認以 in 模式打開
與輸出文件流關聯的文件默認以out模式打開(附帶截斷)
與fstream關聯的文件默認以in和out模式打開
3. 以out 模式打開文件會丟棄已有數據
【file1會被截斷】
ofstream out("file1");
ofstream out("file1", ofstream::out);
ofstream out("file1", ofstream::out | ofstream::trunc);
【保留文件內容】
ofstream out("file1", ofstream::app);
ofstream out("file1", ofstream::out | ofstream::app);
out.open("file1", ofstream::app);
四、例題
T8.4~8.8
文件輸入輸出