file ( 檔案處理 )

19
CSIM, PU C Language File( 檔檔檔檔 ) 學學學學 : 學學 學學學 學學學學學學學學 、、

Upload: taji

Post on 19-Mar-2016

99 views

Category:

Documents


3 download

DESCRIPTION

File ( 檔案處理 ). 學習目標 : 開檔、讀檔、更新檔與關閉檔案. 大綱. 檔案的觀念 檔案的處理方式 檔案的函數使用: fopen …. 檔案的觀念. 檔案儲存的方式可以分為兩種: 文字檔 以 ASCII 碼儲存 , 每個字元皆佔有 1 個位元組。 若將數值 182956 存在文字檔中,會當成 6 個字元來存檔. 以 ASCII 碼儲存. 二進位檔 以二進位的格式儲存,如影像檔或執行檔。 將整數 182956 以二進位的格式來存檔時,會以其二進位的值來儲存. 101100101010101100. 有緩衝區 : - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: File ( 檔案處理 )

CSIM, PU C Language

File( 檔案處理 )學習目標 :開檔、讀檔、更新檔與關閉檔案

Page 2: File ( 檔案處理 )

2CSIM, PU C Language

大綱檔案的觀念檔案的處理方式檔案的函數使用: fopen …

Page 3: File ( 檔案處理 )

3CSIM, PU C Language

檔案的觀念檔案儲存的方式可以分為兩種:

文字檔 以 ASCII 碼儲存 , 每個字元皆佔有 1 個位元組。若將數值 182956 存在文字檔中,會當成 6 個字元來存檔

二進位檔以二進位的格式儲存,如影像檔或執行檔。將整數 182956 以二進位的格式來存檔時,會以其二進位的值來儲存

49 56 50 57 53 54

以 ASCII 碼儲存

101100101010101100

Page 4: File ( 檔案處理 )

4CSIM, PU C Language

檔案的處理方式

有緩衝區 : fopen(" 檔名 ", " 存取模式 ");

無緩衝區open(" 檔名 ", 開啟模式 , 存取屬性 );

程式在執行的時候,會需要一些額外的記憶體來存放資料,以提高程式執行的效率,此暫時存放的區域就稱為緩衝區 (buffer) 。檔案的處理方式

Page 5: File ( 檔案處理 )

5CSIM, PU C Language

fopen函數在使用檔案之前,必須先開啟檔案。可利用標準輸入 / 輸出 (standard I/O) 函數 fopen 來開啟檔案。

fopen 函數需要兩個字串參數:檔案名稱、存取模式 fopen 函數會回傳一個 FILE 指標

範例:FILE *fp; 必須宣告一個指向檔案的指標fp = fopen("phone" , "r"); 將 fp 指標指向 phone 檔案

利用 fopen 函數開啟檔案時,若開啟失敗,會回傳 NULL

Page 6: File ( 檔案處理 )

6CSIM, PU C Language

fopen函數檔案的存取模式如下表:存取模式 代碼 說明讀取資料 r

開啟檔案以供讀取。檔案必須存在,否則會開啟失敗。

寫入資料 w開啟檔案以供寫入。原有檔案若存在,則內容會被覆蓋掉。若檔案不存在,則系統會自動產生此檔案。

附加於檔案之後 a開啟一個檔案,可將資料寫入此檔案的末端。若檔案不存在,系統會自動產生。

Page 7: File ( 檔案處理 )

7CSIM, PU C Language

開檔範例由於反斜線是 C語言中的控制字元,因此必須將路徑中有反斜線 (\) 的部分再加一個反斜線。

#include<stdio.h> void main() { FILE *fp ; /* 宣告指向檔案的指標 fp*/ fp = fopen ("C:\\abc.txt " , "r" ) ; if (fp = = NULL) /* 判斷開檔是否成功 */ printf(" 檔案開啟失敗 \n"); else printf(" 檔案開啟成功 \n"); system("pause"); }

Page 8: File ( 檔案處理 )

8CSIM, PU C Language

存取檔案的常用函數 (1)

函數功能 格式與說明開啟檔案 fopen() 傳回值為檔案指標或 NULL( 開檔失敗 ) 。關閉檔案 int fclose(FILE *fptr); 關閉由 fptr 指向的檔案。讀取字元 int getc(FILE *fptr); 由 fptr 所指向的檔案一次讀取一個字元,傳回值字元。若遇到檔案結尾,會傳回 EO

F 。寫入字元 int putc(int ch, FILE *fptr); 將字元 ch 寫入由 fptr 所指向的檔案。

Page 9: File ( 檔案處理 )

9CSIM, PU C Language

讀檔範例

/*ch 是用來接收讀取的字元 *//*count 用來計算檔案的字元數 */

#include<stdio.h> void main() { FILE *fptr; char ch; int count=0; fptr = fopen("c:\\test.txt" , "r"); if( fptr != NULL) /* 開檔成功 */ { while((ch = getc(fptr)) !=EOF ) /* 判斷是否到達檔尾 */ { printf("%c",ch); count++; // 一次印出一個字元 } fclose(fptr); // 關閉檔案 printf("\n 共有 %d 字元 \n",count); } else printf(" 檔案開啟失敗 !! "); system("pause"); }

Page 10: File ( 檔案處理 )

10CSIM, PU C Language

存取檔案的常用函數 (2)

函數功能 格式與說明寫入字元

int fputc(int ch, FILE *fptr); fputc() 函數返回一個向檔案所寫字元的值,此時寫操作成功,否則返回 EOF( 文件結束結束其值為 -1 ,在 stdio.h 中定義 ) 表示寫操作錯誤。

寫入字串 int fputs(const char *str, FILE *fptr);將字串 str 寫入 fptr 所指向的檔案。

寫入檔案 int fprintf(FILE *fptr, char *format, <variable-list>);將資料以規定格式寫入檔案內 Ex: fprintf(fp,"\2: The average is %6.2f",average);

檢查檔案是否結束int feof(FILE *fptr);檢查 fptr 所指向的檔案是否已讀取到檔案結束的位置。若尚未到達檔尾,則傳回 0 。

Page 11: File ( 檔案處理 )

11CSIM, PU C Language

存取檔案的常用函數 (3)

函數功能 格式與說明讀取字元 int fgetc(FILE *fptr);

fgetc() 函數返回檔案目前位置的一個字元,讀取錯誤時傳回EOF 。

讀取字串 char *fgets(char *str, int maxchar, FILE *fptr);第一個參數:字元陣列名稱 第二個參數:陣列大小第三個參數:指向檔案的指標

讀取檔案int fscanf(FILE *fptr, char *format, <address-list>); fscanf() 函數的用法與 scanf() 函數相似,只是它是從文件中讀到資訊。fscanf() 函數的返回值為 EOF( 即 -1) ,表明讀取資料錯誤。

Page 12: File ( 檔案處理 )

12CSIM, PU C Language

寫檔範例

/* 判斷是否已輸入完畢 */

#include<stdio.h> void main() { FILE *fp; int c; fp = fopen("c:\\hello.txt","w"); while((c=getchar())!=EOF) fputc(c , fp); /* 將字元 c 輸出到 fp 所指的檔案 */ fclose(fp); }

Page 13: File ( 檔案處理 )

13CSIM, PU C Language

將檔案的內容列於螢幕 #include<stdio.h> void main() { int c, r; char filename[20]; FILE *fp; printf("please input a filename:"); scanf("%s",filename); if( (fp=fopen(filename, "r"))==NULL) /* 判斷開檔是否成功 */ printf("Cannot open the file!!\n"); else { while((c=fgetc(fp))!=EOF) /* 判斷是否到達檔尾 */ putchar(c); /* 將字元 c 列於螢幕上 */ if((r=fclose(fp))!=0) /* 判斷關檔是否成功 */ printf("Cannot close file!\n"); } system("pause"); }

Page 14: File ( 檔案處理 )

14CSIM, PU C Language

fgets函數應用 #include<stdio.h> void main() { int r , MAX=80; char str[MAX],*msg; FILE *fptr=fopen("C:\\output.txt","r"); if(fptr==NULL) printf(" 檔案開啟失敗 \n"); else { while(!feof(fptr)) { msg=fgets(str,MAX,fptr); printf("%s",msg); } if((r = fclose(fptr))!=0) printf("Cannot close file!\n"); } system("pause"); }

Page 15: File ( 檔案處理 )

15CSIM, PU C Language

Page 16: File ( 檔案處理 )

16CSIM, PU C Language

存取檔案的常用函數 (4)

函數功能 格式與說明隨機讀取 int fread(void *buf, int size, int count, FILE *fptr);

fread() 函數是從檔案中讀 count 個欄位 , 每個欄位長度為 size 個位元群組 , 並把它們存放到 buf 指標所指的緩衝器中。

隨機寫入 int fwrite(void *buf, int size, int count, FILE *fptr); fwrite() 函數是把 buf 指標所指的緩衝器中 , 長度為 size 個位元群組的 count 個字段寫到 fptr 指向的檔案中去。

指定文件位置

int fseek (FILE *fptr, long offset, int fromwhere); fseek() 函數的作用是將檔案的位置指標設定到從 fromwhere開始的第 offset 位元群組的位置上 文件位置指標起始計算位置 fromwher: SEEK_SET 0 從檔案開頭SEEK_CUR 1 從檔案指標的現行位置 SEEK_END 2 從檔案末尾

Page 17: File ( 檔案處理 )

17CSIM, PU C Language

Page 18: File ( 檔案處理 )

18CSIM, PU C Language

Page 19: File ( 檔案處理 )

19CSIM, PU C Language

練習將以下這篇英文文章的字母全部改成小寫字母。

Water Restrictions to Return to Taoyuan Area WATER RESTRICTIONS ARE RETURNING TO THE TAOYUAN AREA.

WATER OFFICIALS SAY STARTING NEXT WEEK... THEY WILL START REMOVING MUD AND SEDIMENT FROM THE SHI-MEN RESERVOIR. THE CLEAN UP OPERATIONS WILL INCREASE THE WATER'S TURBIDITY, AND THEREBY DECREASE OUTPUT FROM A NEARBY WATER PURIFICATION PLANT. TO MAKE THE WATER RESTRICTIONS MORE FAIR, THEY WILL IMPOSED ON A ROTATING BASIS. OVER THE PAST FOUR DECADES... NEARLY 56-MILLION CUBIC METERS OF SEDIMENT HAVE ACCUMULATED IN THE RESERVOIR... WITH NEARLY 35-PERCENT OF THAT TOTAL FROM TYPHOON AERE ALONE.