睢寧網(wǎng)站建設(shè)xzqjwl深圳推廣公司有哪些
前言
對(duì)于一個(gè)代碼,運(yùn)行時(shí)可能需要保留產(chǎn)生的結(jié)果,例如計(jì)算值,篩選值,記錄點(diǎn)或者小游戲的得分,而正常情況下我們要保存一個(gè)數(shù)據(jù),想到的肯定是打開(kāi)我們的文本軟件,手?jǐn)]文字,今天這篇文章,帶你一起,教代碼寫(xiě)下它的“記憶”

了解文件本質(zhì)
對(duì)于文本文件和二進(jìn)制文件,其實(shí)都是代表了一系列的字節(jié),C語(yǔ)言提供了底層調(diào)用來(lái)處理存儲(chǔ)設(shè)備上的文件,而從一個(gè)C語(yǔ)言程序中移出字節(jié),這種字節(jié)流就叫做數(shù)據(jù)流
數(shù)據(jù)流(data stream)是一組有序,有起點(diǎn)和終點(diǎn)的字節(jié)的數(shù)據(jù)序列。包括輸入流和輸出流。
文件讀寫(xiě)
在需要?jiǎng)?chuàng)建或者要打開(kāi)一個(gè)文件時(shí),我們就可以使用fopen()函數(shù),而關(guān)閉文件則需使用fclose()函數(shù)
創(chuàng)建或者打開(kāi)時(shí)會(huì)初始化類(lèi)型FILE的一個(gè)對(duì)象,格式:
FILE *fopen( const char *filename, const char *mode );
其中filename是文件的命名,而mode是打開(kāi)的模式,制作了一個(gè)表格方便查閱
mode(模式) | 功能 |
r | 以只讀的形式打開(kāi)一個(gè)已有的文本文件,允許讀取文件(不存在則出錯(cuò)) |
w | 以寫(xiě)入的形式打開(kāi)文本文件,不存在,則創(chuàng)建新文件,反之,則從文件起始位置寫(xiě),覆蓋原內(nèi)容 |
a | 以追加模式打開(kāi)文本文件,不存在,則創(chuàng)建,會(huì)在已有文件的內(nèi)容后邊追加內(nèi)容,不會(huì)覆蓋原有內(nèi)容 |
r+ | 以讀寫(xiě)的形式打開(kāi)文本文件,從頭開(kāi)始讀,新數(shù)據(jù)寫(xiě)入只覆蓋所占的空間 |
w+ | 創(chuàng)建一個(gè)新文件,進(jìn)行寫(xiě)入,從頭開(kāi)始讀,文件存在的話(huà)原內(nèi)容全部消失,不存在則創(chuàng)建新文件 |
a+ | 可以和a一樣追加內(nèi)容,同時(shí)從頭開(kāi)始讀 |
wb | 只寫(xiě)模式打開(kāi)二進(jìn)制文件 |
rb | 只讀模式打開(kāi)二進(jìn)制文件 |
ab | 追加模式打開(kāi)二進(jìn)制文件 |
rb+ | 讀寫(xiě)打開(kāi)一個(gè)二進(jìn)制文件,只允許讀寫(xiě)數(shù)據(jù)。 |
rt+ | 讀寫(xiě)打開(kāi)一個(gè)文本文件,允許讀和寫(xiě)。 |
wb+ | 讀寫(xiě)打開(kāi)或建立一個(gè)二進(jìn)制文件,允許讀和寫(xiě)。 |
wt+ | 讀寫(xiě)打開(kāi)或著建立一個(gè)文本文件;允許讀寫(xiě)。 |
at+ | 讀寫(xiě)打開(kāi)一個(gè)文本文件,允許讀或在文本末追加數(shù)據(jù)。 |
ab+ | 讀寫(xiě)打開(kāi)一個(gè)二進(jìn)制文件,允許讀或在文件末追加數(shù)據(jù)。 |
處理二進(jìn)制文件還可用 r+b,w+b,a+b等 |
以上面的格式為例,打開(kāi)或者創(chuàng)建一個(gè)文本文件,然后再關(guān)閉
int main()
{FILE* zh;f = fopen("word.txt", "w");? ? //格式例子if (zh != NULL){fputs("fopen example", zh);fclose(zh);zh=NULL;}return 0;
}
如果成功關(guān)閉文件,fclose( ) 函數(shù)返回零,如果關(guān)閉文件時(shí)發(fā)生錯(cuò)誤,函數(shù)返回 EOF。這個(gè)函數(shù)實(shí)際上,會(huì)清空緩沖區(qū)中的數(shù)據(jù),關(guān)閉文件,并釋放用于該文件的所有內(nèi)存。
EOF 是一個(gè)定義在頭文件 stdio.h 中的常量。
C 標(biāo)準(zhǔn)庫(kù)提供了各種函數(shù)來(lái)按字符或者以固定長(zhǎng)度字符串的形式讀寫(xiě)文件。
學(xué)會(huì)了文件的打開(kāi)模式后,我們就開(kāi)始書(shū)寫(xiě)代碼的“記憶”
文件的讀寫(xiě)函數(shù)
fgetc():讀取一個(gè)字符
fputc():寫(xiě)入一個(gè)字符
fgets():讀取一個(gè)字符串
fputs():寫(xiě)入一個(gè)字符串
fprintf():寫(xiě)入格式化數(shù)據(jù)
fscanf():格式化讀取數(shù)據(jù)
fread():讀取數(shù)據(jù)
fwrite():寫(xiě)入數(shù)據(jù)
我們可以先小試牛刀
試著寫(xiě)入字符進(jìn)一個(gè)txt文件里
第一步:先在一個(gè)地方創(chuàng)建文件夾(方便存儲(chǔ)產(chǎn)生的文件,這里以C盤(pán)為例,我創(chuàng)建了一個(gè)名為tmp的文件夾)

第二步:敲入我們的代碼
#include <stdio.h>
int main(){FILE *fp = NULL; //FILE *fp 是聲明,聲明fp是指針,用來(lái)指向FILE類(lèi)型的對(duì)象。fp = fopen("C:/tmp/1.txt","w+"); /*fopen,以w+允許讀寫(xiě)的模式打開(kāi)路徑上的1.txt文件此時(shí)沒(méi)有1.txt文件,則自動(dòng)新建*/char c = 'c';fputc(c,fp);fprintf(fp,"\n");fprintf(fp,"This is testing for fprintf...\n");fputs("This is testing for fputs...\n",fp);fclose(fp);
}
看我們的第五行代碼,因?yàn)閠mp文件夾是新建的,所以里面沒(méi)有文件,此時(shí)我們運(yùn)行代碼后,文件夾里就自動(dòng)生成了1.txt文件
然后使用了fputc()輸入單個(gè)字符,fprintf()和fputs()寫(xiě)入了兩行字符串
當(dāng)字符多于一個(gè)時(shí),fputc()就會(huì)報(bào)錯(cuò)
我們先看剛剛運(yùn)行代碼后的結(jié)果


此時(shí)txt文件中就出現(xiàn)了我們想要的字符
如何實(shí)現(xiàn)回應(yīng)鍵盤(pán)效果,將鍵盤(pán)上輸入的字符都寫(xiě)入文件中,實(shí)現(xiàn)打字效果呢?
這里我們就可以寫(xiě)一個(gè)while循環(huán)體,運(yùn)用getchar()每次都從鍵盤(pán)讀取一個(gè)字符存進(jìn)遍歷中,然后寫(xiě)入文件
運(yùn)用鍵盤(pán)往文件里寫(xiě)入字符(實(shí)現(xiàn)打字效果)
#include<stdio.h>
int main(){FILE *fp;char ch;fp=fopen("C:/tmp/2.txt","wt+");printf("輸入一段字符串,回車(chē)代表終止\n");while((ch=getchar())!='\n'){fputc(ch,fp); //可以輸入中文喔}fclose(fp);return 0;
}
此時(shí)我們嘗試一下運(yùn)行,輸入:

結(jié)果:

就是這么的神奇
接下來(lái)我們還可以進(jìn)行一些有趣的功能
讀取”記憶“
實(shí)現(xiàn)統(tǒng)計(jì)文章某個(gè)字出現(xiàn)頻率
對(duì)于一個(gè)不需要寫(xiě)入的文本,我們就以r只讀的方式來(lái)打開(kāi)它
如果打不開(kāi),給出錯(cuò)誤提示
運(yùn)用fgetc()讀取字符,通過(guò)while循環(huán)重復(fù)操作,直到無(wú)法讀取到字符為止(即讀完文章最后一個(gè)字符)
#include <stdio.h>
int main ()
{FILE * fp;int ch;int n = 0;fp = fopen ("C:/tmp/myfile.txt", "r");if (fp == NULL) perror ("無(wú)法打開(kāi)此文件"); // 打開(kāi)失敗else{while (ch != EOF){ch = fgetc (fp); // 獲取一個(gè)字符if (ch == 'a') n++; // 統(tǒng)計(jì)美元符號(hào) 'a' 在文件中出現(xiàn)的次數(shù)}fclose (fp); // 一定記得要關(guān)閉文件printf ("a的個(gè)數(shù)為%d個(gè)。\n",n);}return 0;
}
我們預(yù)存一個(gè)文件,內(nèi)容有這些

接下來(lái)我們執(zhí)行上面的代碼,十分簡(jiǎn)單地就把這段亂碼中的”a“成員給揪出來(lái)了
