C語(yǔ)言 以字符形式讀寫(xiě)文件詳解及示例代碼
在C語(yǔ)言中,讀寫(xiě)文件比較靈活,既可以每次讀寫(xiě)一個(gè)字符,也可以讀寫(xiě)一個(gè)字符串,甚至是任意字節(jié)的數(shù)據(jù)(數(shù)據(jù)塊)。本節(jié)介紹以字符形式讀寫(xiě)文件。
以字符形式讀寫(xiě)文件時(shí),每次可以從文件中讀取一個(gè)字符,或者向文件中寫(xiě)入一個(gè)字符。主要使用兩個(gè)函數(shù):fgetc()和fputc()。
字符讀取函數(shù) fgetc
fgetc 是 file get char 的縮寫(xiě),意思是從指定的文件中讀取一個(gè)字符。它的原型為:
int fgetc (FILE *fp);
fp 為文件指針。fgetc() 讀取成功時(shí)返回讀取到的字符,讀取到文件末尾或讀取失敗時(shí)返回EOF。
EOF 是 end of file 的縮寫(xiě),表示文件末尾,是在 stdio.h 中定義的宏,它的值是一個(gè)負(fù)數(shù),往往是 -1。返回值類(lèi)型之所以為 int,就是為了容納這個(gè)負(fù)數(shù)(char不能是負(fù)數(shù))。
EOF 不絕對(duì)是 -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è)位置指針,用來(lái)指向當(dāng)前讀寫(xiě)到的位置,也就是讀寫(xiě)到第幾個(gè)字節(jié)。在文件打開(kāi)時(shí),該指針總是指向文件的第一個(gè)字節(jié)。使用fgetc 函數(shù)后,該指針會(huì)向后移動(dòng)一個(gè)字節(jié),所以可以連續(xù)多次使用fgetc讀取多個(gè)字符。
注意:這個(gè)文件內(nèi)部的位置指針與C語(yǔ)言中的指針不是一回事。位置指針僅僅是一個(gè)標(biāo)志,表示文件讀寫(xiě)到的位置,也就是讀寫(xiě)到第幾個(gè)字節(jié),它不表示地址。文件每讀寫(xiě)一次,位置指針就會(huì)移動(dòng)一次,它不需要你在程序中定義和賦值,而是由系統(tǒng)自動(dòng)設(shè)置,對(duì)用戶(hù)是透明的。
【示例】在屏幕上顯示 D:\\demo.txt 文件的內(nèi)容。
#include<stdio.h> int main(){ FILE *fp; char ch; //如果文件不存在,給出提示并退出 if( (fp=fopen("D:\\demo.txt","rt")) == NULL ){ printf("Cannot open file, press any key to exit!"); getch(); exit(1); } //每次讀取一個(gè)字節(jié),直到讀取完畢 while( (ch=fgetc(fp)) != EOF ){ putchar(ch); } putchar('\n'); //輸出換行符 fclose(fp); return 0; }
在D盤(pán)下創(chuàng)建demo.txt文件,輸入任意內(nèi)容并保存,運(yùn)行程序,就會(huì)看到剛才輸入的內(nèi)容全部都顯示在屏幕上。
該程序的功能是從文件中逐個(gè)讀取字符,在屏幕上顯示,直到讀取完畢。
程序第14行是關(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() 就無(wú)法讀取字符了,于是返回 EOF,表示文件讀取結(jié)束了。
對(duì)EOF的說(shuō)明
EOF 本來(lái)表示文件末尾,意味著讀取結(jié)束,但是很多函數(shù)在讀取出錯(cuò)時(shí)也返回 EOF,那么當(dāng)返回EOF時(shí),到底是文件讀取完畢了還是讀取出錯(cuò)了?我們可以借助 stdio.h 中的兩個(gè)函數(shù)來(lái)判斷,分別是 feof() 和 ferror()。
feof() 函數(shù)用來(lái)判斷文件內(nèi)部指針是否指向了文件末尾,它的原型是:
int feof ( FILE * fp );
當(dāng)指向文件末尾時(shí)返回非零值,否則返回零值。
ferror() 函數(shù)用來(lái)判斷文件操作是否出錯(cuò),它的原型是:
int ferror ( FILE *fp );
出錯(cuò)時(shí)返回非零值,否則返回零值。
需要說(shuō)明的是,文件出錯(cuò)是非常少見(jiàn)的情況,上面的示例基本能夠保證將文件內(nèi)的數(shù)據(jù)讀取完畢。如果追求完美,也可以加上判斷并給出提示:
#include<stdio.h> int main(){ FILE *fp; char ch; //如果文件不存在,給出提示并退出 if( (fp=fopen("D:\\demo.txt","rt")) == NULL ){ printf("Cannot open file, press any key to exit!"); getch(); exit(1); } //每次讀取一個(gè)字節(jié),直到讀取完畢 while( (ch=fgetc(fp)) != EOF ){ putchar(ch); } putchar('\n'); //輸出換行符 if(ferror(fp)){ puts("讀取出錯(cuò)"); }else{ puts("讀取成功"); } fclose(fp); return 0; }
這樣,不管是出錯(cuò)還是正常讀取,都能夠做到心中有數(shù)。
字符寫(xiě)入函數(shù)fputc
fputc 是 file output char 的所以,意思是向指定的文件中寫(xiě)入一個(gè)字符。調(diào)用的形式為:
int fputc ( int ch, FILE *fp );
ch 為要寫(xiě)入的字符,fp 為文件指針。fputc() 寫(xiě)入成功時(shí)返回寫(xiě)入的字符,失敗時(shí)返回EOF,返回值類(lèi)型為 int 也是為了容納這個(gè)負(fù)數(shù)。例如:
fputc('a', fp);
或者:
char ch = 'a';
fputc(ch, fp);
表示把字符 'a' 寫(xiě)入fp所指向的文件中。
兩點(diǎn)說(shuō)明
1) 被寫(xiě)入的文件可以用寫(xiě)、讀寫(xiě)、追加方式打開(kāi),用寫(xiě)或讀寫(xiě)方式打開(kāi)一個(gè)已存在的文件時(shí)將清除原有的文件內(nèi)容,并將寫(xiě)入的字符放在文件開(kāi)頭。如需保留原有文件內(nèi)容,并把寫(xiě)入的字符放在文件末尾,就必須以追加方式打開(kāi)文件。不管以何種方式打開(kāi),被寫(xiě)入的文件若不存在時(shí)則創(chuàng)建該文件。
2) 每寫(xiě)入一個(gè)字符,文件內(nèi)部位置指針向后移動(dòng)一個(gè)字節(jié)。
【示例】從鍵盤(pán)輸入一行字符,寫(xiě)入文件。
#include<stdio.h> int main(){ FILE *fp; char ch; //判斷文件是否成功打開(kāi) if( (fp=fopen("D:\\demo.txt","wt+")) == NULL ){ printf("Cannot open file, press any key to exit!\n"); getch(); exit(1); } printf("Input a string:\n"); //每次從鍵盤(pán)讀取一個(gè)字符并寫(xiě)入文件 while ( (ch=getchar()) != '\n' ){ fputc(ch,fp); } fclose(fp); return 0; }
運(yùn)行程序,輸入一行字符并按回車(chē)鍵結(jié)束,打開(kāi)D盤(pán)下的demo.txt文件,就可以看到剛才輸入的內(nèi)容。
程序每次從鍵盤(pán)讀取一個(gè)字符并寫(xiě)入文件,直到按下回車(chē)鍵,while 條件不成立,結(jié)束讀取。
以上就是對(duì)C 語(yǔ)言 以字符形式讀寫(xiě)文件的基礎(chǔ)資料,后續(xù)繼續(xù)添加相關(guān)資料,謝謝大家對(duì)本站的支持!
上一篇:淺談c語(yǔ)言中類(lèi)型隱性轉(zhuǎn)換的坑
欄 目:C語(yǔ)言
本文標(biāo)題:C語(yǔ)言 以字符形式讀寫(xiě)文件詳解及示例代碼
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2080.html
您可能感興趣的文章
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用函數(shù)刪除字符
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)式函數(shù)庫(kù)
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)數(shù)怎么表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段函數(shù)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排序法函數(shù)
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段函數(shù)
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎么打出三角函數(shù)的值
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求階乘


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10delphi制作wav文件的方法
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置