C語言fgetc和fputc函數用法詳解(以字符形式讀寫文件)

文章來源:http://c.biancheng.net/view/2068.htmlhtml

在C語言中,讀寫文件比較靈活,既能夠每次讀寫一個字符,也能夠讀寫一個字符串,甚至是任意字節的數據(數據塊)。本節介紹以字符形式讀寫文件。面試

以字符形式讀寫文件時,每次能夠從文件中讀取一個字符,或者向文件中寫入一個字符。主要使用兩個函數,分別是 fgetc() 和 fputc()。算法

字符讀取函數 fgetc

fgetc 是 file get char 的縮寫,意思是從指定的文件中讀取一個字符。fgetc() 的用法爲:函數

int fgetc (FILE *fp);學習

fp 爲文件指針。fgetc() 讀取成功時返回讀取到的字符,讀取到文件末尾或讀取失敗時返回EOF。.net

EOF 是 end of file 的縮寫,表示文件末尾,是在 stdio.h 中定義的宏,它的值是一個負數,每每是 -1。fgetc() 的返回值類型之因此爲 int,就是爲了容納這個負數(char不能是負數)。指針

EOF 不絕對是 -1,也能夠是其餘負數,這要看編譯器的實現。視頻

fgetc() 的用法舉例:htm

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/C++和算法的優質內容,學習交流,技術探討,面試指導,簡歷修改...還有超多源碼素材等學習資料,零基礎的視頻等着你!

還沒關注的小夥伴,能夠長按關注一下:

相關文章
相關標籤/搜索