C/C++‎ > ‎

檔案處理

2013/01/23 謝碧景(c)編製更新 

一、串流

(一)串流(或資料流)


C++ 語言提供 I/O 裝置(如:螢幕、鍵盤、記憶體、磁碟)的存取採串流方式,串流是一連串的資料,以 fstream類別將資料讀取或寫入檔案儲存,語法格式如下:

 #include <fstream>                                  //引用 <fstream.h> 標頭檔

 fstream file;                                            //宣告一個 fstream 物件,以fstream類別建立物件file

 file.open("readme.txt",ios::in);                   //以讀取模式開啟 readme.txt 檔


(二) fstream 物件的 open 函數

1.利用 fstream 物件的 open 成員函數開啟一個檔案,其參數有兩個,一個是檔名,另一個是開啟檔案的模式參數,常用的模式參數如下:

 模式參數

說明

 ios::in

檔案開啟為讀取狀態

 ios::out

檔案開啟為寫入狀態

 ios::ate

從檔案結尾讀取及寫入資料

 ios::app

將資料附加在檔案結尾

 ios::trunc

如果檔案存在,就清除檔案內的資料


2.若傳入的模式參數超過兩個,可用【|】符號分開,如下:以寫入模式開啟readme.txt 檔,並將資料加至檔案結尾

 #include <fstream>                                  //引用 <fstream.h> 標頭檔

 fstream file;                                            //宣告一個 fstream 物件,以fstream類別建立物件file

 file.open("readme.txt",ios::out|ios::app);     //以寫入模式開啟 readme.txt 檔,並將資料加至檔案結尾



(三)常用的檔案處理函數

 函數

說明

 open(file,mode)

以 mode 模式開啟名為 file 的檔案

 close()

關閉檔案

 is_open()

檢查檔案是否為開啟狀態,若是則傳回 true,否則傳回 flase

 eof()

判斷是否至檔案結尾

 write(buffer,n)

將 buffer 陣列中 n 個字元寫入至檔案中


二、檔案讀取

常用的檔案讀取方式,如下:

 read(buffer,n)

自目前位置至檔案結尾為止,讀取 n 個字元至 buffer 陣列

 get(ch)

讀取一個字元至 ch 字元變數

 getline(buffer,sizeof(buffer))

讀取一行至buffer陣列


 範例1:開啟 readme.txt 檔,自檔案開始讀取 n 個字元資料,並放入 buffer 陣列。

執行結果  readme.txt 文字檔

*註:本例為一次讀取全部的檔案資料;若需字元逐一讀取,可用 file.get(ch) 為一次讀取一個字元,並將檔案指標移至下一個字元,直到 eof() 則結束讀取


 範例2:開啟 readme.txt 檔 (同上題),自檔案開始一次讀取一個字元,讀取全部資料,並顯示出 ,執行結果同上。

註:標頭檔 <fstream.h> .h 可省略。

 範例3:開啟 readme.txt 檔 (同上題),自檔案開始一行一行讀取,讀取全部資料,並顯示出,執行結果同上。

註:使用 file.getline(buffer) 可讀取一行的檔案資料。

三、資料寫入檔案

(一)將資料輸出至檔案

語法格式:

 #include <fstream>                                   //引用 <fstream.h> 標頭檔

 fstream file;                                             //宣告一個 fstream 物件

 file.open("text.txt",ios::out);                       //以寫入模式開啟 text.txt 檔


(二)執行寫入檔案的兩種方式

【方式一】

 file<<資料;                               //將資料寫入檔案,例 file<<"姓名\t座號\n";

語法格式與 cout 相同,都是串流資料的寫入動作,差別在 file 是將資料寫入檔案,而 cout 是將資料顯示在螢幕上。
   

 範例4:將資料以串流方式寫入text.txt檔案。

執行結果  資料寫入 text.txt 檔案



【方式二】

 file.write(buffer,n)                        //將 buffer 陣列中 n 個字元寫入檔案


 範例5:將鍵盤輸入之資料以 file.write() 方式寫入text.txt檔案中,並將資料附加在檔案結尾。

執行結果:輸入資料  新增資料附加在檔案結尾 text.txt 文字檔
註:(1) file.open("text.txt", ios::out | ios::app); 若傳入的模式參數超過兩個,可用『|』符號分開。
   (2) char buffer[n] 以字元陣列儲存 cin.getline(buffer,strlen(buffer),'\n') 函式輸入的字串

   (3)在 cin.getline(buffer,strlen(buffer),'\n') 輸入的資料可包括『空白鍵』、『Tab鍵』,但輸入『Enter』鍵則結束輸入



 範例練習

題:顯示數字和。(取自88年全國資訊學科能力競賽第1題)
設計一個程式讀取 in_a.txt 文字檔(包含文字和數字),將數字相加之後儲存至 out_a.txt 中。

方法1方法2:先將數字字串拆解後儲存至字串陣列中,再從字串陣列中取出轉換為數值後相加。
執行結果儲存至 out_a.txt