1. 程式人生 > >文件輸入輸出

文件輸入輸出

ref 相關操作 font bit inpu 進行 定義 管理 作用

一、關鍵點

頭文件 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

文件輸入輸出