最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2021年01月11日 15:49:07   作者:C語言中文網(wǎng)  
這篇文章主要介紹了C語言fgetc和fputc函數(shù)用法詳解(以字符形式讀寫文件),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在C語言中,讀寫文件比較靈活,既可以每次讀寫一個(gè)字符,也可以讀寫一個(gè)字符串,甚至是任意字節(jié)的數(shù)據(jù)(數(shù)據(jù)塊)。本節(jié)介紹以字符形式讀寫文件。

以字符形式讀寫文件時(shí),每次可以從文件中讀取一個(gè)字符,或者向文件中寫入一個(gè)字符。主要使用兩個(gè)函數(shù),分別是 fgetc() 和 fputc()。

字符讀取函數(shù) fgetc

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

int fgetc (FILE *fp);

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

EOF 是 end of file 的縮寫,表示文件末尾,是在 stdio.h 中定義的宏,它的值是一個(gè)負(fù)數(shù),往往是 -1。fgetc() 的返回值類型之所以為 int,就是為了容納這個(gè)負(fù)數(shù)(char不能是負(fù)數(shù))。

EOF 不絕對是 -1,也可以是其他負(fù)數(shù),這要看編譯器的實(shí)現(xiàn)。

fgetc() 的用法舉例:

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

表示從D:\\demo.txt文件中讀取一個(gè)字符,并保存到變量 ch 中。

在文件內(nèi)部有一個(gè)位置指針,用來指向當(dāng)前讀寫到的位置,也就是讀寫到第幾個(gè)字節(jié)。在文件打開時(shí),該指針總是指向文件的第一個(gè)字節(jié)。使用 fgetc() 函數(shù)后,該指針會(huì)向后移動(dòng)一個(gè)字節(jié),所以可以連續(xù)多次使用 fgetc() 讀取多個(gè)字符。

注意:這個(gè)文件內(nèi)部的位置指針與C語言中的指針不是一回事。位置指針僅僅是一個(gè)標(biāo)志,表示文件讀寫到的位置,也就是讀寫到第幾個(gè)字節(jié),它不表示地址。文件每讀寫一次,位置指針就會(huì)移動(dòng)一次,它不需要你在程序中定義和賦值,而是由系統(tǒng)自動(dòng)設(shè)置,對用戶是隱藏的。

【示例】在屏幕上顯示 D:\\demo.txt 文件的內(nèi)容。

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

在D盤下創(chuàng)建 demo.txt 文件,輸入任意內(nèi)容并保存,運(yùn)行程序,就會(huì)看到剛才輸入的內(nèi)容全部都顯示在屏幕上。

該程序的功能是從文件中逐個(gè)讀取字符,在屏幕上顯示,直到讀取完畢。

程序第 13 行是關(guān)鍵,while 循環(huán)的條件為(ch=fgetc(fp)) != EOF。fget() 每次從位置指針?biāo)诘奈恢米x取一個(gè)字符,并保存到變量 ch,位置指針向后移動(dòng)一個(gè)字節(jié)。當(dāng)文件指針移動(dòng)到文件末尾時(shí),fget() 就無法讀取字符了,于是返回 EOF,表示文件讀取結(jié)束了。

對 EOF 的說明

EOF 本來表示文件末尾,意味著讀取結(jié)束,但是很多函數(shù)在讀取出錯(cuò)時(shí)也返回 EOF,那么當(dāng)返回 EOF 時(shí),到底是文件讀取完畢了還是讀取出錯(cuò)了?我們可以借助 stdio.h 中的兩個(gè)函數(shù)來判斷,分別是 feof() 和 ferror()。

feof() 函數(shù)用來判斷文件內(nèi)部指針是否指向了文件末尾,它的原型是:

int feof ( FILE * fp );

當(dāng)指向文件末尾時(shí)返回非零值,否則返回零值。

ferror() 函數(shù)用來判斷文件操作是否出錯(cuò),它的原型是:

int ferror ( FILE *fp );

出錯(cuò)時(shí)返回非零值,否則返回零值。

需要說明的是,文件出錯(cuò)是非常少見的情況,上面的示例基本能夠保證將文件內(nèi)的數(shù)據(jù)讀取完畢。如果追求完美,也可以加上判斷并給出提示:

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

這樣,不管是出錯(cuò)還是正常讀取,都能夠做到心中有數(shù)。

字符寫入函數(shù) fputc

fputc 是 file output char 的所以,意思是向指定的文件中寫入一個(gè)字符。fputc() 的用法為:

int fputc ( int ch, FILE *fp );

ch 為要寫入的字符,fp 為文件指針。fputc() 寫入成功時(shí)返回寫入的字符,失敗時(shí)返回 EOF,返回值類型為 int 也是為了容納這個(gè)負(fù)數(shù)。例如:

fputc('a', fp);

或者:

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

表示把字符 'a' 寫入fp所指向的文件中。

兩點(diǎn)說明

1) 被寫入的文件可以用寫、讀寫、追加方式打開,用寫或讀寫方式打開一個(gè)已存在的文件時(shí)將清除原有的文件內(nèi)容,并將寫入的字符放在文件開頭。如需保留原有文件內(nèi)容,并把寫入的字符放在文件末尾,就必須以追加方式打開文件。不管以何種方式打開,被寫入的文件若不存在時(shí)則創(chuàng)建該文件。

2) 每寫入一個(gè)字符,文件內(nèi)部位置指針向后移動(dòng)一個(gè)字節(jié)。

【示例】從鍵盤輸入一行字符,寫入文件。

#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");
  //每次從鍵盤讀取一個(gè)字符并寫入文件
  while ( (ch=getchar()) != '\n' ){
    fputc(ch,fp);
  }
  fclose(fp);
  return 0;
}

運(yùn)行程序,輸入一行字符并按回車鍵結(jié)束,打開D盤下的 demo.txt 文件,就可以看到剛才輸入的內(nèi)容。

程序每次從鍵盤讀取一個(gè)字符并寫入文件,直到按下回車鍵,while 條件不成立,結(jié)束讀取。

到此這篇關(guān)于C語言fgetc和fputc函數(shù)用法詳解(以字符形式讀寫文件)的文章就介紹到這了,更多相關(guān)C語言fgetc和fputc函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談c++中的異常處理機(jī)制

    淺談c++中的異常處理機(jī)制

    C++異常處理機(jī)制通過try/catch/throw結(jié)構(gòu)處理運(yùn)行時(shí)錯(cuò)誤,本文就來介紹一下c++中的異常處理機(jī)制,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-02-02
  • Qt實(shí)現(xiàn)轉(zhuǎn)動(dòng)輪播圖

    Qt實(shí)現(xiàn)轉(zhuǎn)動(dòng)輪播圖

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)轉(zhuǎn)動(dòng)輪播圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • Dijkstra最短路徑算法實(shí)現(xiàn)代碼

    Dijkstra最短路徑算法實(shí)現(xiàn)代碼

    這篇文章主要介紹了Dijkstra最短路徑算法實(shí)現(xiàn)代碼,有需要的朋友可以參考一下
    2013-12-12
  • C++實(shí)現(xiàn)簡單的圖書管理系統(tǒng)

    C++實(shí)現(xiàn)簡單的圖書管理系統(tǒng)

    本文給大家分享的是使用C++實(shí)現(xiàn)簡單的圖書管理系統(tǒng)的代碼,本系統(tǒng)采用了面向?qū)ο蟮某绦蛟O(shè)計(jì)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2015-08-08
  • C語言超詳細(xì)講解指針的概念與使用

    C語言超詳細(xì)講解指針的概念與使用

    本文主要講解C語言中指針和字符串的關(guān)系以及指針和數(shù)組的關(guān)系,在看本文之前大家可以先看看博主之前的C語言基礎(chǔ)篇,先對C語言指針先有個(gè)基礎(chǔ)的了解,有助于對本文章有更深一步的了解
    2022-05-05
  • C語言數(shù)據(jù)結(jié)構(gòu)與算法之排序總結(jié)(二)

    C語言數(shù)據(jù)結(jié)構(gòu)與算法之排序總結(jié)(二)

    這篇文章住要介紹的是選擇類排序中的簡單、樹形和堆排序,歸并排序、分配類排序的基數(shù)排序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2021-12-12
  • VSCode遠(yuǎn)程開發(fā)調(diào)試服務(wù)器c/c++代碼

    VSCode遠(yuǎn)程開發(fā)調(diào)試服務(wù)器c/c++代碼

    語音相關(guān)的好多項(xiàng)目要在linux上跑,但代碼開發(fā)大多是在PC機(jī)上,本篇簡單介紹一下怎么在個(gè)人電腦上用VSCode遠(yuǎn)程開發(fā)調(diào)試服務(wù)器上的c/c++代碼。感興趣的朋友跟隨小編一起看看吧
    2020-04-04
  • C語言分治法實(shí)現(xiàn)歸并排序

    C語言分治法實(shí)現(xiàn)歸并排序

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)歸并排序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • MATLAB算法技巧和實(shí)現(xiàn)斐波那契數(shù)列的解決思路

    MATLAB算法技巧和實(shí)現(xiàn)斐波那契數(shù)列的解決思路

    這篇文章主要介紹了MATLAB算法技巧和實(shí)現(xiàn)斐波那契數(shù)列,這篇主要說一下自己在算法設(shè)計(jì)課上用matlab做的兩道算法題,題目解起來都比較簡單,但是需要些技巧,需要的朋友可以參考下
    2022-12-12
  • C++?重載運(yùn)算符在HotSpot?VM中的應(yīng)用小結(jié)

    C++?重載運(yùn)算符在HotSpot?VM中的應(yīng)用小結(jié)

    C++支持運(yùn)算符重載,對于Java開發(fā)者來說,這個(gè)可能比較陌生一些,因?yàn)镴ava不支持運(yùn)算符重載,下面介紹一下HotSpot?VM中的運(yùn)算符重載,感興趣的朋友跟隨小編一起看看吧
    2023-09-09

最新評(píng)論

信丰县| 乌海市| 平度市| 兖州市| 慈溪市| 当阳市| 大关县| 周至县| 吐鲁番市| 轮台县| 新田县| 鲜城| 花莲县| 乌鲁木齐市| 凤翔县| 双牌县| 诏安县| 延川县| 内江市| 巫山县| 方正县| 苗栗县| 怀宁县| 墨江| 平阴县| 贡觉县| 陆河县| 冀州市| 谷城县| 临沭县| 鹤山市| 马山县| 郓城县| 正蓝旗| 南投市| 改则县| 双江| 化隆| 水城县| 屏南县| 仁布县|