130 likes | 227 Views
第十三章 檔案處理. 13-1 檔案的開啓與關閉 13-2 字元 I/O 13-3 字串 I/O 13-4 格式化 I/O. 第十三章 檔案處理.
E N D
第十三章 檔案處理 • 13-1 檔案的開啓與關閉 • 13-2 字元I/O • 13-3 字串I/O • 13-4 格式化I/O
第十三章 檔案處理 將資料存入磁碟或由磁碟取出資料的方式,稱為檔案處理。且所有的程式語言,都提供了資料輸出入的處理功能,諸如檔案的開啟、寫入及關閉等等。這一章將介紹如何針對不同形式的資料,使用C語言程式實作資料輸出入於磁碟的動作。Turbo C的檔案處理分為三種模式,分別是字元I/O,字串I/O及格式化I/O。使用者應依照資料的格式,選擇適當的模式。其次,不論使用那一種模式,均應執行檔案的開啓與關閉。所以,本章分為四節介紹Turbo C的檔案處理,分別是檔案的開啓與關閉、字元I/O、字串I/O及格式化I/O。
13-1 檔案的開啓與關閉 不論使用何種語言,當我們欲執行檔案的存取時,一定要先行開啓檔案,等到所有資料都處理完後,還要將檔案關閉,C語言亦是如此。以下程式是使用字元模式,將鍵盤所輸入的字元,存入”test1.txt”中。 #include <stdio.h> main( ) { FILE *fptr; char c; fptr = fopen (“textfile.txt”, “w”); while((c=getche( )) != ‘r’) putc(c, fptr); fclose(fptr); }
stdio.h 所有的檔案處理的函式,都包含在stdio.h中,所以檔案處理前均應使用 以下敘述,匯入stdio.h。 #include “stdio.h” FILE型別 C語言的檔案存取,皆使用FILE的型別。當發出開啓檔案之要求,且此要求被認 可,則系統將傳回一個指向檔案的FILE型別。以下敘述,即宣告一個指標變數 fptr,FILE *fptr;往後,即可使用指標fptr存取檔案資料。 fopen 當您欲從磁碟存取資料時,首先必須以fopen開啓指定的檔案,其函式原型如 下: FILE *fopen (const char *filename, const char *mode);
fclose 將緩衝區的資料寫入磁碟,關閉檔案,其語法如下: int fclose (file *stream); 當寫入成功時,傳回0。 開檔的問題 如果以fopen函式所指定的檔案不能開啓,則程式將不能執行。為什麼一 個檔案不能被開啓呢?例如,於輸入檔中,磁碟空間不足,或開啓讀取 檔時,此檔案根本未存在。為了避免以上錯誤,因此在開啓檔案時,應 先檢查檔案的開啓是否順利,所以,開檔的敘述應修正如下: FILE *fptr; if( (fptr = fopen(“test1.txt”, “r”))==NULL) { printf(“can not open the file”); exit(); }
13-2 字元I/O putc putc與前面的putch或putchar相近,只是寫入的位置不同, 前者是將字元寫入檔案,後兩者是寫入螢幕。例如,以下敘 述可將ch所指定的字元,寫入所開啓的檔案。 putc(ch, fptr); 其次,若要連續將鍵盤所輸入的字元,寫入指定的檔案,直 到按Return鍵為止,則其程式如下, while((ch=getche()) != ‘\r’) putc(ch, fptr);
getc getc剛好與putc相反,getc可從指定的檔案傳回一個字元。例如,以下敘 述可從檔案中傳回一個字元。 ch = getc(ptr); 以下敘述則可將指定的檔案,全部列印在螢幕。 while((ch=getc(fptr)) != EOF) printf(“%c”, ch); 範例13-2a 請寫一個程式,可以將鍵盤輸入的字元,儲存在test1.txt。 範例13-2b 請寫一個程式,可以將test1.txt顯示在螢幕。 範例13-2c請寫一個程式,可以計算test1.txt的字元數目。
13-3 字串I/O fputs fputs可以將指定的字串寫入檔案。例如,以下敘述可將“abc”字串寫入指 定的檔案test3.txt。 FILE *fptr; char s[]=”abc”; fptr = fopen(“test3.txt”, “w”); fputs(s, fptr);
fgets fgets可以從指定的檔案中,讀取一列字串。例如,以下敘述可從test3.txt 中讀取一列字串,並輸出於螢幕。 FILE *fptr; char s[101]; fptr = fopen(“test3.txt”, “r”); fgets(s, 100, fptr); 上式的fget共需要3個參數,第一個s是傳回的字串,第2個100是字串的 最大長度,本例因宣告s的長度為101,所以應限制為100,以免超過陣 列的大小。
範例13-3a 請寫一個程式,可將使用者所輸入的字串寫入檔案 test3.txt。其次,每寫入一列,應自動補上一個新行的字串 (“\n”)。 範例13-3b 請寫一個程式,可讀取上例的test3.txt,並顯示在螢幕。
13-4 格式化I/O 到目前為止,我們只能處理字元或字串等型別的資料,那數值型別的資 料呢?例如,在一個學生基本資料中,即含有姓名、身高及成績等欄 位,此時即可使用本單元的格式化I/O。格式化I/O所使用的函式分別是 fprintf與fscanf,且其用法與第四章的printf與scanf相同,只是寫入的地 點不同而已。以下分別介紹此二函式。 fprintf 當您欲寫入資料至檔案時,只要重覆使用fprintf即可寫入資料,其函式原 型如下圖。 int fprintf (FILE *stream, const char *format [ , argument,...]);
例如,以下敘述可寫入字串,其中outf是開檔時所傳回的檔案指標。 fprintf (outf, “%s”, “ABC”); 以下敘述可寫入整數。 fprintf (outf, “%d”, 25); 以下敘述,可同時寫入一個字串,一個整數及一個浮點數。 fprintf (outf, “%s %d %f”, “示範”, 90, 25.5); fscanf fscanf當您欲從檔案讀取資料時,只要重覆使用fscanf即可讀取資料,其 函式原型如下,使用方式同fprintf。 int fscanf (FILE *stream, const char *format [ , address,...]);
範例13-4a 假設有學生資料如下: 請寫一個程式,可以由使用者輸入以上資料,直到姓名長度為0時,將以 上資料存入test4.txt。 範例13-4b 同上範例,但可讀取test4.txt,並將其內容顯示在螢幕。