1、C 程式設計 檔案處理,台大資訊工程學系 資訊系統訓練班,課程大綱,C語言簡介 基本資料型態, 變數, 基本輸入輸出 控制敘述- 選擇控制與重覆控制 陣列 函式 指標 字元與字串 結構 檔案處理,本次課程大綱,C語言的檔案處理 檔案類型 開檔與關檔 檔案I/O函式 隨機式存取 二進位檔的存取,C語言的檔案觀念,C語言將資料都看成由一連串字元組成的資料流(stream). 標準檔案I/O函數在fopen()開啟一個檔案後,C語言會要求作業系統在主記憶體保留一塊空間做為檔案I/O的缓衝區.所有檔案I/O動作則是對這塊缓衝區做字元的讀取跟寫入,直到檔案被關閉後fclose(),檔案的內容才會真正寫回
2、儲存設備.,檔案類型,文字檔: 方便閱讀,但較無保密性。其他使用者也可以透過純文字編輯器開啟並成功閱讀。 二進位檔: I/O速度較快並具有保密性,但檔案內容需透過程式轉譯才能閱讀。二進位檔的資料是由一連串的位元組(Byte)所組合,通常使用在某些特殊用途(例如圖檔),文字資料與二元資料,文字資料流以字串形成儲存在檔案中,以n做為換行字元,以Z做為EOF二元資料流與記憶體相同格式來儲存在檔案中,檔案的開啟跟關閉,fopen()跟fclose()對某個檔案進行讀取寫入的動作前,一定要先開啟檔案,當將資料處理完成後,還要關閉檔案,我們稱之為缓衝式的I/O處理,其功能在增進檔案處理效率,因而無須時時讀
3、取磁碟機.,FILE,FILE是在stdio.h中宣告的結構體,主要用於存放I/O stream在主記憶體的位址.FILE能記錄下一個讀取或寫入字元目前位於stream的位址,檔案讀寫狀況,及檔案讀寫是否有錯誤發生.,fopen(),FILE *fopen (char filename, char mode);filename代表要開啟的檔案名稱.mode代表要對檔案處理的模式.若開啟檔案有誤,則回傳NULL。,fopen()開啟檔案的模式,Mode 功能說明“r” 開啟一個只能讀取資料的檔案“w” 建立用來寫入資料的檔案,若檔案存在,其內容會被覆蓋 “a” 將新的資料加在檔尾;若檔案不存在,
4、則另建新檔“+” 提供可寫可讀的功能,但不能單獨存在以上4種模式可以混合使用, 例如 “rw” “ra” “r+” 代表文字資料流的話要加”t”, 內定是文字模式 代表二元資料流的話要加”b”,fclose(),int *fclose(FILE *fp); 當回傳值為-1時,代表關閉檔案時發生錯誤。當回傳值等於0,則表示成功關閉檔案例子: 嘗試開啟檔案跟關閉檔案.,I/O函式,C語言的檔案I/O處理功能是由函式庫所提供的,ANSI提供一套標準檔案I/O函式,使在不同作業系統下,能有一套標準的I/O函式.由於有標準介面,我們將無須理會不同作業系統與I/O函式的介面問題,而這也是C語言所以具有高度
5、可攜性的原因之一.,字元I/O函式,fgetc()跟fputc()int fgetc(FILE* fp); 傳回所讀取的字元, 如果是EOF則代表讀到檔案結尾. Int *fputc(int c, FILE *fp); 傳回EOF表示寫入過程有錯誤,傳回c則表示成功寫入.,例子,例子1: 輸入資料到檔案中.例子2: 讀取一個文字檔,並印在螢幕上.,字串I/O函式,char *fgets(char *str,int n, FILE *fp); 從檔案讀取一行字串,傳回NULL代表有錯誤發生或檔案結束.int fputs(char *str, FILE *fp); 傳回-1(EOF)表示有錯誤發生
6、.,格式化I/O函式,int fscanf(FILE *fp, char *format ); 傳回0表示有錯誤,否則傳回成功輸出的資料數.int fprintf(FILE *fp, char *format ); 傳回0表示有錯誤,否則傳回成功輸出的資料數.例子: 以指定的格式輸出學生序號,姓名及英數成積到檔案.,隨機讀寫,int fseek(FILE *fp, long offset, int where); 傳為0代表成功,否則失敗 offset:偏移檔案指標offset個位置。 where=0, 代表檔案的起始位置 where=1, 代表目前檔案的指標位置 where=2, 代表檔案的
7、結尾例子:移到檔案末端, 使用fseek()更新檔案.,二元資料的開啟,fopen(filename,“rb“); /* 開檔時,指定讀取binary檔案 */ fopen(filename,“wb“); /* 開檔時,指定寫入資料到binary檔案 */ fopen(filename,“ab“); /* 開檔時,指定將資料加在binary檔案的後面 */ 例子,二元資料的讀取跟寫入(1),size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);回傳值:實際讀取的資料筆數,size_t資料型態定義於stdio,通常是un
8、signed int的別名。 ptr:存放資料的緩衝區指標。 size:要讀取的資料型態大小。 nmemb:要讀取的資料筆數。 stream:一個已開啟的檔案指標,代表要讀取的檔案串流。,二元資料的讀取跟寫入(2),size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream); 回傳值:實際寫入的資料筆數,size_t資料型態定義於stdio,通常是unsigned int的別名。 ptr:存放資料的緩衝區指標。 size:要寫入的資料型態大小。 nmemb:要寫入的資料筆數。 stream:一個已開啟的檔案指標,代表要寫入的檔案串流。 例子,練習時間,請將員工資料,寫入二進位檔,並讀出,今天學到了什麼,什麼是C語言的檔案處理 什麼是檔案類型 如何使用開檔與關檔 如何使用檔案I/O函式 如何隨機存取檔案 如何存取二進位檔,