1. 程式人生 > 程式設計 >C語言fgetc和fputc函式用法詳解(以字元形式讀寫檔案)

C語言fgetc和fputc函式用法詳解(以字元形式讀寫檔案)

在C語言中,讀寫檔案比較靈活,既可以每次讀寫一個字元,也可以讀寫一個字串,甚至是任意位元組的資料(資料塊)。本節介紹以字元形式讀寫檔案。

以字元形式讀寫檔案時,每次可以從檔案中讀取一個字元,或者向檔案中寫入一個字元。主要使用兩個函式,分別是 fgetc() 和 fputc()。

字元讀取函式 fgetc

fgetc 是 file get char 的縮寫,意思是從指定的檔案中讀取一個字元。fgetc() 的用法為:

int fgetc (FILE *fp);

fp 為檔案指標。fgetc() 讀取成功時返回讀取到的字元,讀取到檔案末尾或讀取失敗時返回EOF。

EOF 是 end of file 的縮寫,表示檔案末尾,是在 stdio.h 中定義的巨集,它的值是一個負數,往往是 -1。fgetc() 的返回值型別之所以為 int,就是為了容納這個負數(char不能是負數)。

EOF 不絕對是 -1,也可以是其他負數,這要看編譯器的實現。

fgetc() 的用法舉例:

char ch;
FILE *fp = fopen("D:\\demo.txt","r+");
ch = fgetc(fp);

表示從D:\\demo.txt檔案中讀取一個字元,並儲存到變數 ch 中。

在檔案內部有一個位置指標,用來指向當前讀寫到的位置,也就是讀寫到第幾個位元組。在檔案開啟時,該指標總是指向檔案的第一個位元組。使用 fgetc() 函式後,該指標會向後移動一個位元組,所以可以連續多次使用 fgetc() 讀取多個字元。

注意:這個檔案內部的位置指標與C語言中的指標不是一回事。位置指標僅僅是一個標誌,表示檔案讀寫到的位置,也就是讀寫到第幾個位元組,它不表示地址。檔案每讀寫一次,位置指標就會移動一次,它不需要你在程式中定義和賦值,而是由系統自動設定,對使用者是隱藏的。

【示例】在螢幕上顯示 D:\\demo.txt 檔案的內容。

#include<stdio.h>
int main(){
  FILE *fp;
  char ch;
  
  //如果檔案不存在,給出提示並退出
  if( (fp=fopen("D:\\demo.txt","rt")) == NULL ){
    puts("Fail to open file!");
    exit(0);
  }
  //每次讀取一個位元組,直到讀取完畢
  while( (ch=fgetc(fp)) != EOF ){
    putchar(ch);
  }
  putchar('\n'); //輸出換行符
  fclose(fp);
  return 0;
}

在D盤下建立 demo.txt 檔案,輸入任意內容並儲存,執行程式,就會看到剛才輸入的內容全部都顯示在螢幕上。

該程式的功能是從檔案中逐個讀取字元,在螢幕上顯示,直到讀取完畢。

程式第 13 行是關鍵,while 迴圈的條件為(ch=fgetc(fp)) != EOF。fget() 每次從位置指標所在的位置讀取一個字元,並儲存到變數 ch,位置指標向後移動一個位元組。當檔案指標移動到檔案末尾時,fget() 就無法讀取字元了,於是返回 EOF,表示檔案讀取結束了。

對 EOF 的說明

EOF 本來表示檔案末尾,意味著讀取結束,但是很多函式在讀取出錯時也返回 EOF,那麼當返回 EOF 時,到底是檔案讀取完畢了還是讀取出錯了?我們可以藉助 stdio.h 中的兩個函式來判斷,分別是 feof() 和 ferror()。

feof() 函式用來判斷檔案內部指標是否指向了檔案末尾,它的原型是:

int feof ( FILE * fp );

當指向檔案末尾時返回非零值,否則返回零值。

ferror() 函式用來判斷檔案操作是否出錯,它的原型是:

int ferror ( FILE *fp );

出錯時返回非零值,否則返回零值。

需要說明的是,檔案出錯是非常少見的情況,上面的示例基本能夠保證將檔案內的資料讀取完畢。如果追求完美,也可以加上判斷並給出提示:

#include<stdio.h>
int main(){
  FILE *fp;
  char ch;
 
  //如果檔案不存在,給出提示並退出
  if( (fp=fopen("D:\\demo.txt","rt")) == NULL ){
    puts("Fail to open file!");
    exit(0);
  }
  //每次讀取一個位元組,直到讀取完畢
  while( (ch=fgetc(fp)) != EOF ){
    putchar(ch);
  }
  putchar('\n'); //輸出換行符
  if(ferror(fp)){
    puts("讀取出錯");
  }else{
    puts("讀取成功");
  }
  fclose(fp);
  return 0;
}

這樣,不管是出錯還是正常讀取,都能夠做到心中有數。

字元寫入函式 fputc

fputc 是 file output char 的所以,意思是向指定的檔案中寫入一個字元。fputc() 的用法為:

int fputc ( int ch,FILE *fp );

ch 為要寫入的字元,fp 為檔案指標。fputc() 寫入成功時返回寫入的字元,失敗時返回 EOF,返回值型別為 int 也是為了容納這個負數。例如:

fputc('a',fp);

或者:

char ch = 'a';
fputc(ch,fp);

表示把字元 'a' 寫入fp所指向的檔案中。

兩點說明

1) 被寫入的檔案可以用寫、讀寫、追加方式開啟,用寫或讀寫方式開啟一個已存在的檔案時將清除原有的檔案內容,並將寫入的字元放在檔案開頭。如需保留原有檔案內容,並把寫入的字元放在檔案末尾,就必須以追加方式開啟檔案。不管以何種方式開啟,被寫入的檔案若不存在時則建立該檔案。

2) 每寫入一個字元,檔案內部位置指標向後移動一個位元組。

【示例】從鍵盤輸入一行字元,寫入檔案。

#include<stdio.h>
int main(){
  FILE *fp;
  char ch;
  //判斷檔案是否成功開啟
  if( (fp=fopen("D:\\demo.txt","wt+")) == NULL ){
    puts("Fail to open file!");
    exit(0);
  }
  printf("Input a string:\n");
  //每次從鍵盤讀取一個字元並寫入檔案
  while ( (ch=getchar()) != '\n' ){
    fputc(ch,fp);
  }
  fclose(fp);
  return 0;
}

執行程式,輸入一行字元並按回車鍵結束,開啟D盤下的 demo.txt 檔案,就可以看到剛才輸入的內容。

程式每次從鍵盤讀取一個字元並寫入檔案,直到按下回車鍵,while 條件不成立,結束讀取。

到此這篇關於C語言fgetc和fputc函式用法詳解(以字元形式讀寫檔案)的文章就介紹到這了,更多相關C語言fgetc和fputc函式內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!