用c語言處理文件

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