檔案 將資料存入磁碟或由磁碟取出資料的方式, 稱為檔案存取處理。 C語言的檔案處理 C++語言的檔案處理
檔案的種類 檔案依資料存取方式可分為循序檔與隨機檔, 分別說明如下: 循序檔 採用整批儲存與整批取出資料的方式稱為循序檔, 此種存取模式較適合文書檔的儲存。例如, 當我們編輯一封書信時, 通常都是整篇儲存, 編輯時亦是整篇取出修改後全部儲存。 隨機檔 可以指定資料位置的存取方式稱為隨機檔, 此種存取模式較適合數值資料的儲存。例如, 你可能從一堆學生資料中讀取或修改某一個人的成績。又例如, 104 的電話查號, 亦是從一大堆資料中讀取一筆資料, 此時當然沒有必要將全部資料全部載入記憶體, 而是依照自己的需求讀取指定位置的某一或某些筆資料即可, 此時即需使用隨機檔。
檔案處理的演進 C 語言 程序導向的C 語言是採用fopen、fclose 、fprintf、fscanf 及feof 等函式處理循序或隨機檔案, 請看15-1 節。 C + + 語言 物件導向的C++ 語言是採用ifstream 、ofstream 等類別的方式處理循序或隨機檔案, 請看15-2 節。 C++ Builder C++ Builder 則是採用資料庫元件的方式處理檔案, 由於資料庫元件已有長足的進步, 所以本書於第16 ~22 章大力介紹這些資料庫元件。關於C 與C++ 的檔案處理則僅以循序檔簡介, 讀者可於此體會這些程式語言的演進。
15 -1 C 語言的檔案處理 C 語言常用的檔案處理函式, 分別是fopen 、fclose 、fprintf 、fscanf 、feof、fseek 、fwrite 、fread、fileno 、filelength 及sizeof 等函式, 使用這些函式前應匯入stdio.h, 如下所示。 #include <stdio.h>
fopen 當您欲從磁碟存取資料時, 首先必須以fopen 開啟指定的檔案, 其函式原型共有兩種多載如下, 本單元僅舉例說明第一種多載。 其中mode 是開檔的模式, 所有模式如下圖所示。 例如, 以下敘述可開啟test1.txt, 並準備寫入資料。 FILE *outf; outf=fopen("c:\\BCBbook\\ch15\\test1.txt", "w");
fprintf 當您欲寫入資料至檔案時, 只要重覆使用fprintf 即可寫入資料, 其函式原型如下圖。 format
Conversion-type character 所有的資料均應格式化才可存檔, 其格式化字元如下圖。 例如, 以下敘述可寫入字串, 其中outf 是開檔時所傳回的檔案指標。 fprintf(outf, "%s", "ABC"); 以下敘述可寫入整數。 fprintf(outf, "%d", 25); 以下敘述, 可同時寫入一個字串, 一個整數及一個浮點數。 fprint(outf, "%s %d %f", " 子堯", 90, 25.5);
fscanf 當您欲從檔案讀取資料時, 只要重覆使用fscanf 即可讀取資料, 其函式原型如下, 使用方式同fprintf 。
fclose 將緩衝區的資料寫入磁碟, 其語法如下: int fclose(file *stream); 當寫入成功時, 傳回0。
feof 傳回檔案指標是否已在檔案的最後面, 若是則傳回非零值;若否則傳回0。其語法如下: int feof(File *stream);
範例15-1a 請寫一個程式, 可以將RichEdit 元件的內容存入檔案且能將文字檔載入RichEdit 。
1 5 -2 C ++ 語言的檔案處理 眾所皆知, C++ 是物件導向的程式語言, 所以在檔案的處理亦實作了許多關於檔案的類別, 例如ofstream 、ifstream 與fstream 等類別。若要使用這些類別, 則應先匯入fstream, 如以下敘述。 #include <fstream.h>
ofstream ofstream 是專門處理資料輸出的類別, 以下兩種方式皆可建立一個fout物件, 此物件可將資料輸出至C:\BCBbook\ch15\test1.txt 。 ofstream fout ("C:\\BCBbook\\ch15\\test1.txt"); 或 ofstream fout; fout.open("C:\\BCBbook\\ch15\\test1.txt", ios::out); 以下敘述皆可將"ABCDEF" 寫入指定的檔案。 fout.write("ABCDEF", 6); fout << "ABCDEF";
ifstream ifstream 是專門處理資料輸入的類別, 以下敘述可建立一個fin 物件, 並將C:\BCBbook\ch15\test1.txt 的內容指派由RichEdit 元件顯示。 ifstream fin; String ss=""; char ch; fin.open("c:\\BCBbook\\ch15\\test1.txt", ios::in); w h i l e ( f i n . g e t ( c h ) ) ss=ss+ch; f i n . c l o s e ( ) ; R i c h Ed i t 1 - >T e x t= s s ;
範例15-2a 示範C++ 的檔案處理