在Linux標(biāo)準(zhǔn)IO中,就是用庫(kù)函數(shù)對(duì)文件進(jìn)行操作。在C語(yǔ)言中有許多庫(kù)函數(shù)方便用戶去對(duì)文件進(jìn)行操作。下面談?wù)勔恍┖?jiǎn)單基本的函數(shù),這些函數(shù)都是被包含在頭文件stdio.h中的。
一、fopen()函數(shù)
要操作一個(gè)文件,我們肯定先打開(kāi)它,這里打開(kāi)并不是去右鍵文件然后左鍵打開(kāi)。這里的打開(kāi)是指讓系統(tǒng)知道程序員要操作哪個(gè)文件,如果聽(tīng)起來(lái)比較抽象可以看看函數(shù)原型便于理解。
1、函數(shù)原型
FILE *fopen( const char *fname, const char *mode );
fopen()函數(shù)打開(kāi)由fname(文件名)指定的文件, 并返回一個(gè)關(guān)聯(lián)該文件的流。如果發(fā)生錯(cuò)誤, fopen()返回NULL。mode(方式)是用于決定文件的用途。(例如 用于輸入,輸出,等等)
這里的文件名是可以包含路徑的文件名,例如"../test.txt"。
FILE這個(gè)玩意兒把他當(dāng)成一個(gè)數(shù)據(jù)類(lèi)型即可,它是由標(biāo)準(zhǔn)庫(kù)定義的一個(gè)東西,就像我們自己定義結(jié)構(gòu)體時(shí),把結(jié)構(gòu)體名稱(chēng)當(dāng)做一個(gè)數(shù)據(jù)類(lèi)型。
Mode(方式) | 意義 |
"r" | 打開(kāi)一個(gè)用于讀取的文本文件 |
"w" | 創(chuàng)建一個(gè)用于寫(xiě)入的文本文件 |
"a" | 附加到一個(gè)文本文件 |
"rb" | 打開(kāi)一個(gè)用于讀取的二進(jìn)制文件 |
"wb" | 創(chuàng)建一個(gè)用于寫(xiě)入的二進(jìn)制文件 |
"ab" | 附加到一個(gè)二進(jìn)制文件 |
"r+" | 打開(kāi)一個(gè)用于讀/寫(xiě)的文本文件 |
"w+" | 創(chuàng)建一個(gè)用于讀/寫(xiě)的文本文件 |
"a+" | 打開(kāi)一個(gè)用于讀/寫(xiě)的文本文件 |
"rb+" | 打開(kāi)一個(gè)用于讀/寫(xiě)的二進(jìn)制文件 |
"wb+" | 創(chuàng)建一個(gè)用于讀/寫(xiě)的二進(jìn)制文件 |
"ab+" | 打開(kāi)一個(gè)用于讀/寫(xiě)的二進(jìn)制文件 |
附加的意思是在文件末尾接著進(jìn)行讀/寫(xiě)操作,"w"沒(méi)有附加說(shuō)明它是擦除原文件內(nèi)容,重新寫(xiě)入。
舉個(gè)栗子:
FILE* fp = fopen("demo.txt","w"); //意味著以擦除原來(lái)的內(nèi)容重新寫(xiě)入的方式打開(kāi)一個(gè)demo.txt文件
這兒的fp就相當(dāng)于那個(gè)代號(hào)。
二、fclose()函數(shù)
? 提到了打開(kāi),就得想到關(guān)閉。fclose()函數(shù)就是要完成這件事的函數(shù),下面是函數(shù)原型:
int fclose( FILE *stream );
函數(shù)fclose()關(guān)閉給出的文件流, 釋放已關(guān)聯(lián)到流的所有緩沖區(qū)。fclose()執(zhí)行成功時(shí)返回0,否則返回EOF。(這里的EOF已經(jīng)在標(biāo)準(zhǔn)庫(kù)中定義,是一個(gè)常數(shù))
這個(gè)函數(shù)的形參名字是流,正好對(duì)應(yīng)fopen()函數(shù)的返回值(關(guān)聯(lián)該文件的流),也就是“代號(hào)”,我們上一步已經(jīng)把其返回值保存到fp中。所以要關(guān)閉一個(gè)文件,代碼也就很好寫(xiě)了。
fclose(fp);
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-607392.html
三、fgetc()函數(shù)
? 當(dāng)學(xué)會(huì)了打開(kāi)和關(guān)閉,接下來(lái)就該去讀讀寫(xiě)寫(xiě)了。我們先從讀開(kāi)始,先讀讀字符,下面是它的函數(shù)原型。
int fgetc( FILE *stream );
?
fgetc()函數(shù)返回來(lái)自stream(流)中的下一個(gè)字符,如果到達(dá)文件尾或者發(fā)生錯(cuò)誤時(shí)返回EOF。
當(dāng)讀取完一個(gè)字符的時(shí)候,讀取的位置會(huì)自動(dòng)跳到下一個(gè)字符后面。(可以利用這個(gè)特點(diǎn)去循環(huán)遍歷一整個(gè)文件)
函數(shù)很簡(jiǎn)單,例子也好寫(xiě):
char ch = 0; ch = fgetc(fp); printf("%c",ch);
?
?
四、小試牛刀
經(jīng)過(guò)以上的了解,可以寫(xiě)出一個(gè)利用fgetc()函數(shù)去遍歷整個(gè)文件了。
舉個(gè)栗子,這里有一個(gè)文件demo2.txt其內(nèi)容如圖所示。
? 如何去實(shí)現(xiàn)遍歷這個(gè)文本文件呢?
?、偈紫瓤隙ㄊ堑美胒open()去讀這個(gè)文件,要想操作一個(gè)文件就得fopen()。
②利用循環(huán)語(yǔ)句和fgetc()讀取文件字符,邊讀取變打印。
?、圩x完后利用close()函數(shù)關(guān)閉文件。
具體代碼如下:
#include "stdio.h" int main() { FILE* fp = fopen("demo2.txt","r");int ch = 0; ch = fgetc(fp); while(ch != EOF) { printf("%c",ch); ch = fgetc(fp); } printf("\n"); fclose(fp); return 0; }
注:為什么ch不用char類(lèi)型,因?yàn)椴┲鰿PU是ARM架構(gòu),處理char類(lèi)型有點(diǎn)小出入。這里尤其感謝我的老師的指導(dǎo),對(duì)嵌入式又有了新的認(rèn)知。
結(jié)果如圖:
?
發(fā)現(xiàn)與原文本一模一樣,這個(gè)小試牛刀就算結(jié)束了。
以上只是本人的理解和所見(jiàn),如有不同見(jiàn)解和看法,歡迎在評(píng)論區(qū)批評(píng)指正。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-607392.html
?
到了這里,關(guān)于Linux標(biāo)準(zhǔn)IO對(duì)文件的基本操作(一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!