用c語言處理檔案

烏衣行者發表於2020-09-13

  用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  } 

 

相關文章