用c語言處理檔案只需要用到幾個簡單的函式:
1.檔案的開啟和關閉
fopen()函式用來開啟一個檔案,該函式原型在標頭檔案stdio.h中,呼叫的一般形式為
1 /* FILE 是c語言內建的一個結構體型別,可以直接使用 */ 2 /* 這裡定義了一個指向檔案l型別的指標 */ 3 FILE *fp; 4 fp = fopen(檔名,使用檔案方式); 5 6 /* 使用檔案方式是指要對檔案進行哪些操作 */
使用檔案方式:
r(只讀) 開啟一個文字檔案,只允許讀取資料
w(只寫) 開啟或建立一個文字檔案,只允許寫入資料
a(追加) 開啟一個文字檔案,並在檔案末尾寫入資料
rb(只讀) 開啟一個二進位制檔案,只允許讀取資料
wb(只寫) 開啟或建立一個二進位制檔案,只允許寫資料
wa(追加) 開啟一個二進位制檔案,並在檔案末尾寫資料
r+(讀寫) 開啟一個文字檔案,執行讀和寫
w+(讀寫) 開啟或建立一個文字檔案,允許讀和寫
a+(讀寫) 開啟一個文字檔案,允許讀或者在檔案末尾追加資料
rb+(讀寫) 開啟一個二進位制檔案,允許讀和寫
wb+(讀寫) 開啟或建立一個二進位制檔案,允許讀和寫
ab+(讀寫) 開啟一個二進位制檔案,允許讀,或者在檔案末尾追加資料
如果使用fopen()函式開啟檔案失敗,通常有下面幾種原因:
1. 指定的碟符或路徑不存在
2. 檔名中含有無效字元
3. 以r模式開啟一個不存在的檔案
每次開啟檔案並操作之後一定要記得關閉檔案,這樣做的目的是防止因為沒有關閉檔案而造成的資料流失!
關閉檔案用函式 fclose(fp);
當檔案正常關閉,該函式返回,否則返回 EOF
2. 檔案的讀寫
fputc(ch,fp); => 該函式把字元ch寫入到fp所指向的檔案,寫入成功則返回被寫入的字元,失敗則返回EOF
ch = fgetc(fp); => 該函式從fp所指向的檔案中讀取一個字元賦值給ch,該檔案必須是以讀或讀寫的方式開啟的
fputs(str,fp); => 該函式向fp指向的檔案中寫入一個字串,其中字串可以是字串常量,也可以是字元陣列名、指標或變數
fgets(*str,n,fp); => 該函式從fp指向的檔案中讀取一個字串到str中,n表示讀取到字元的個數
fprintf(fp,"%d",i); => 該函式將i的值以%d格式寫入到fp指向的檔案中
fscanf(fp,"%d",&i); => 該函式從fp所指的檔案中讀取一個字元並以%d的格式賦值給i
fread(str,size,count,fp); => 該函式從fp所指的檔案中讀入count次,每次讀size位元組,讀入的資訊存放在str地址中
fwrite(str,size,count,fp); => 該函式將從str地址開始的資料分 count 次寫入 fp 指向的檔案中,每次寫入size位元組
3. 檔案的定位
我們對檔案的操作不一定每次都要從頭開始,所以我們要有辦法來移動游標在檔案中的位置,在這裡介紹幾個可以完成定位功能的函式
fseek(fp,nL,i);
該函式在fp所指向的檔案內部定位游標,其中 i 的值為 1、2、3。
i = 0 => 定位到檔案首
i = 1 => 定位到當前位置
i = 0 => 定位到檔案尾
n表示從i所指示位置的位移量,如 fseek(fp,2L,0); 表示從檔案頭開始向前移動兩個位元組。
需要注意的是這個函式一般用於二進位制檔案,在文字檔案中由於要進行轉換,所以計算的位置往往會出現錯誤。
rewind(fp);
該函式在fp所指向的檔案內部將游標定位到檔案開頭。
該函式無返回值。
rtell(fp);
該函式得到流式檔案中的當前位置,用相對於檔案開頭的位移量來表示。
當ftell()函式的返回值為 -1L 時,表示出錯
測試程式碼
1 #include<stdio.h> 2 #include<string.h> 3 4 void main() 5 { 6 // 建立檔案指標 7 FILE *fp; 8 char ch = 'a'; 9 char *str = "hhhhhhhhhhhhh"; 10 char str1[100]; 11 12 //建立或開啟檔案 13 fp = fopen("test.txt","w+"); 14 15 // 讀入一個字元到檔案********************** 16 ch = fputc(ch,fp); 17 18 // 關閉檔案 19 fclose(fp); 20 21 fp = fopen("test.txt","r"); 22 // 從資料夾中讀取一個字元 *********************** 23 ch = fgetc(fp); 24 printf("從資料夾中讀取字元:%c\n",ch); 25 fclose(fp); 26 27 // 寫入字串 ****************************** 28 fp = fopen("test.txt","a"); 29 fputs(str,fp); 30 printf("寫入字串\n"); 31 fclose(fp); 32 33 // 讀取字串 ***************************** 34 fp = fopen("test.txt","r"); 35 fgets(str1,10,fp); 36 printf("從檔案中讀取字串:%s\n",str); 37 fclose(fp); 38 39 // 利用 fprintf()函式寫入資料到檔案***************************** 40 fp = fopen("test.txt","a"); 41 fprintf(fp,"%s","\nhahahahaha"); 42 fclose(fp); 43 44 // 利用 fscanf()函式讀取資料到程式*********************************** 45 // 一次讀取一個字串,遇到空格結束 46 fp = fopen("test.txt","r"); 47 fscanf(fp,"%s",str1); 48 printf("從資料夾中讀取字串:%s\n",str1); 49 fscanf(fp,"%s",str1); 50 printf("從資料夾中讀取字串:%s\n",str1); 51 fclose(fp); 52 53 54 // 利用 fread() 和 fwrite() 函式成段讀取和傳入資料********************************* 55 fp = fopen("test.txt","r"); 56 fread(str1,10,2,fp); 57 printf("從資料夾中讀取兩次字串,每次讀取10個:%s\n",str1); 58 fclose(fp); 59 60 fp = fopen("test.txt","a"); 61 fwrite("12345678901234567890",10,2,fp); 62 printf("向資料夾中輸入兩次字串,每次輸入10個字元!\n"); 63 fclose(fp); 64 65 // 檔案的定位********************************************** 66 fp = fopen("test.txt","r+"); 67 // 從當前位置向前移兩格 68 fseek(fp,2L,1); 69 fscanf(fp,"%s",str1); 70 printf("當前位置字串為:%s\n",str1); 71 72 // 從檔案尾向後退十格 73 fseek(fp,-10L,2); 74 fscanf(fp,"%s",str1); 75 printf("當前位置字串為:%s\n",str1); 76 77 // 返回檔案開頭 78 rewind(fp); 79 fscanf(fp,"%s",str1); 80 printf("(開頭)當前位置字串為:%s\n",str1); 81 82 // 返回當前游標的位置,用相對於開頭的位移量來表示 83 // 當返回值是-1L時表示出錯 84 fseek(fp,20L,0); 85 printf("當前游標在檔案中的位置是:%d\n",ftell(fp)); 86 fscanf(fp,"%s",str1); 87 printf("當前位置字串為:%s\n",str1); 88 89 fclose(fp); 90 }