目錄
創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括福安網(wǎng)站建設(shè)、福安網(wǎng)站制作、福安網(wǎng)頁(yè)制作以及福安網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,福安網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到福安省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!一. 文件介紹
1.文件的分類(lèi)
2.關(guān)于數(shù)據(jù)文件
3.文件名
二.引言
三. C程序中文件的打開(kāi)和關(guān)閉
1.文件信息區(qū)
2.文件打開(kāi)和關(guān)閉函數(shù)
3.實(shí)現(xiàn)文件的打開(kāi)與關(guān)閉
四.文件的順序讀寫(xiě)
1.文件讀取示例:
2.文件的寫(xiě)入示例:
3.文件名數(shù)據(jù)文件的內(nèi)容不是程序,而是程序運(yùn)行時(shí)讀寫(xiě)的數(shù)據(jù),比如程序運(yùn)行需要從中讀取數(shù)據(jù),或者輸出內(nèi)容到其中.
一個(gè)文件要有唯一的文件標(biāo)識(shí)(為了方便,我們就將文件標(biāo)識(shí)稱為文件名),以便用戶識(shí)別和引用。
二.引言文件名包含3個(gè)部分 :文件路徑+文件名主干+文件后綴
學(xué)習(xí)文件操作之前,我們所編寫(xiě)的程序都是在與計(jì)算機(jī)的動(dòng)態(tài)內(nèi)存(比如鍵盤(pán)輸入緩存區(qū),輸出終端等)進(jìn)行數(shù)據(jù)交換,程序本身的運(yùn)行也是在動(dòng)態(tài)內(nèi)存中進(jìn)行的,所以程序關(guān)閉后,所有的數(shù)據(jù)都會(huì)被清理。若想要讓程序所處理的數(shù)據(jù)得到保存并可以在下次運(yùn)行程序時(shí)直接將相關(guān)數(shù)據(jù)導(dǎo)入到程序中,我們就必須讓程序?qū)崿F(xiàn)文件操作,通過(guò)文件操作,程序便可以和計(jì)算機(jī)硬盤(pán)中的數(shù)據(jù)文件進(jìn)行數(shù)據(jù)交換,存儲(chǔ)在硬盤(pán)數(shù)據(jù)文件中的數(shù)據(jù)可以持久地保存并隨時(shí)可以被取用。?
輸入輸出流是抽象的概念,是開(kāi)發(fā)人員為了編程人員使用方便統(tǒng)一封裝起來(lái)的過(guò)程,其具體的實(shí)現(xiàn)細(xì)節(jié)無(wú)須我們關(guān)心。?
三. C程序中文件的打開(kāi)和關(guān)閉 1.文件信息區(qū)C語(yǔ)言程序,只要運(yùn)行起來(lái),就默認(rèn)打開(kāi)了三個(gè)流:
stdin--標(biāo)準(zhǔn)輸入流--鍵盤(pán)
stdout--標(biāo)準(zhǔn)輸出流--屏幕
stderr--標(biāo)準(zhǔn)錯(cuò)誤流--用于輸出警告信息
每個(gè)被使用的文件都在內(nèi)存中開(kāi)辟了一個(gè)相應(yīng)的文件信息區(qū),用來(lái)存放文件的相關(guān)信息(如文件的名字,文件狀態(tài)及文件當(dāng)前的位置等)。這些信息是保存在一個(gè)結(jié)構(gòu)體變量中的。該結(jié)構(gòu)體類(lèi)型是有系統(tǒng)聲明的,取名FILE。
在VS2013編譯環(huán)境中該類(lèi)結(jié)構(gòu)體定義如下:
struct _iobuf{
? ? ? ? ? ? ? ? char *_ptr;
? ? ? ? ? ? ? ? int? ? ? _cnt;
? ? ? ? ? ? ? ? char *_base;
? ? ? ? ? ? ? ? int? ? ? _flag;
? ? ? ? ? ? ? ? int? ? ? _file;
? ? ? ? ? ? ? ? int? ? ? _charbuf;
? ? ? ? ? ? ? ? int? ? ? _bufsize
? ? ? ? ? ? ? ? char *_tmpfname;
? ? ? ? ? ? ? ? };
typedef struct _iobuf FILE;
不同的編譯器FILE類(lèi)型的包含的內(nèi)容不完全相同,但是大同小異。?
C程序調(diào)用文件打開(kāi)函數(shù)時(shí),系統(tǒng)會(huì)根據(jù)文件的情況自動(dòng)在內(nèi)存中創(chuàng)建用于存儲(chǔ)該文件各類(lèi)信息的FILE結(jié)構(gòu)體變量,這種結(jié)構(gòu)體變量就是文件信息區(qū)。創(chuàng)建的過(guò)程函數(shù)調(diào)用者無(wú)須關(guān)心。
2.文件打開(kāi)和關(guān)閉函數(shù)通過(guò)文件信息區(qū)中的信息就能訪問(wèn)該文件(訪問(wèn)操作也是通過(guò)調(diào)用庫(kù)函數(shù)實(shí)現(xiàn),因此具體細(xì)節(jié)也無(wú)須使用者關(guān)心)。
文件在讀寫(xiě)之前應(yīng)該先打開(kāi)文件,在使用結(jié)束之后應(yīng)該關(guān)閉文件。
文件的打開(kāi)和關(guān)閉都是通過(guò)調(diào)用庫(kù)函數(shù)實(shí)現(xiàn)的。
文件打開(kāi)函數(shù):? ?FILE? * fopen (const char * filename , const char * mode);
FILE * 是指向文件信息區(qū)的結(jié)構(gòu)體指針變量;
const char*filename 用于接收完整的文件名(字符串常量的首地址)
const char*mode? ? ? 用于接收文件打開(kāi)方式(也是用字符串常量表示):
常用打開(kāi)方式 說(shuō)明 "r"
以“只讀”方式打開(kāi)文件。只允許讀取,不允許寫(xiě)入。文件必須存在,否則打開(kāi)失敗。 "w" 以“寫(xiě)入”方式打開(kāi)文件。如果文件不存在,那么創(chuàng)建一個(gè)新文件;如果文件存在,那么清空文件內(nèi)容(相當(dāng)于刪除原文件,再創(chuàng)建一個(gè)新文件)。 "a" 以“追加”方式打開(kāi)文件。如果文件不存在,那么創(chuàng)建一個(gè)新文件;如果文件存在,那么將寫(xiě)入的數(shù)據(jù)追加到文件的末尾(文件原有的內(nèi)容保留)。 "r+" 以“讀寫(xiě)”方式打開(kāi)文件。既可以讀取也可以寫(xiě)入,也就是隨意更新文件。文件必須存在,否則打開(kāi)失敗。 "w+" 以“寫(xiě)入/更新”方式打開(kāi)文件,相當(dāng)于 w
和r+
疊加的效果。既可以讀取也可以寫(xiě)入,也就是隨意更新文件。如果文件不存在,那么創(chuàng)建一個(gè)新文件;如果文件存在,那么清空文件內(nèi)容(相當(dāng)于刪除原文件,再創(chuàng)建一個(gè)新文件)。"a+" 以“追加/更新”方式打開(kāi)文件,相當(dāng)于a和r+疊加的效果。既可以讀取也可以寫(xiě)入,也就是隨意更新文件。如果文件不存在,那么創(chuàng)建一個(gè)新文件;如果文件存在,那么將寫(xiě)入的數(shù)據(jù)追加到文件的末尾(文件原有的內(nèi)容保留)。
文件關(guān)閉函數(shù) : int fclose (FILE*stream);
FILE* stream 用于接收指向所要關(guān)閉文件的結(jié)構(gòu)體指針變量
3.實(shí)現(xiàn)文件的打開(kāi)與關(guān)閉文件打開(kāi)函數(shù)調(diào)用者需用一個(gè)FILE*指針來(lái)維護(hù)系統(tǒng)所創(chuàng)建的FILE結(jié)構(gòu)的變量。
因此需要?jiǎng)?chuàng)建一個(gè)FILE*指針變量來(lái)接收f(shuō)open函數(shù)返回的FILE*指針
示例:(文件名根據(jù)實(shí)際情況來(lái)寫(xiě))
#includeint main ()
{
FILE* ptr =NULL;
if((ptr=fopen("C:\\code\\text.txt","r"))==NULL)
{
perror("fopen");
exit(0);
}
fclose(ptr);
ptr=NULL; //文件關(guān)閉后,F(xiàn)ILE結(jié)構(gòu)體銷(xiāo)毀,指針要置空
return 0;
}
注意將文件名傳入fopen時(shí)文件名中的 \ 用另一個(gè)\來(lái)修飾不然會(huì)被解讀為轉(zhuǎn)義字符
perror是一個(gè)錯(cuò)誤警告函數(shù),在這里用于檢驗(yàn)文件打開(kāi)是否成功
四.文件的順序讀寫(xiě)文件會(huì)占用系統(tǒng)資源,所以打開(kāi)后要記得關(guān)閉。?
1.文件讀取示例:文件中的數(shù)據(jù)一般是以字符的方式存儲(chǔ)的
fgets函數(shù)--->按行讀取文件:
Get a string from a stream.
char * fgets( char *string, intn, FILE *stream);
該函數(shù)的功能是按行讀取文件,每調(diào)用一次會(huì)讀取文件中一行的數(shù)據(jù),第一次調(diào)用讀第一行,第二次調(diào)用讀第二行(以此類(lèi)推)。
將FILE*所操作的文件中n個(gè)字節(jié)的內(nèi)容讀取到程序中的字符數(shù)組string中。
char *string 用于接收字符數(shù)組首元素地址,n表示讀取的字節(jié)數(shù)
#includeint main()
{
FILE* ptrf = NULL;
char arr[40] = { 0 }; 用于接收從文件中讀取的內(nèi)容
if ((ptrf = fopen("D:\\Program Files (x86)\\作業(yè)文檔\\行者視覺(jué)組第五次培訓(xùn)\\行者視覺(jué)組第五次培訓(xùn)\\2.txt", "r")) == NULL)
{
perror("fopen");
return 1;
}
int i = 0;
for (i = 0; i< 6; i++)
{
fgets(arr, 40, ptrf); 讀取文件中6行的內(nèi)容,每讀一次打印一次
printf("%s\n", arr);
} 注意本例中每一次讀取都會(huì)覆蓋arr中原有的內(nèi)容
fclose(ptrf);
ptrf = NULL;
return 0;
}
2.文件的寫(xiě)入示例:注意文件打開(kāi)方式用"r".?
fputs函數(shù):
Write a string to a stream.
int fputs( const char *string, FILE *stream);
函數(shù)的功能是將 const char *string 所指向的字符串寫(xiě)入到FILE*stream所操作的文件中
#includeint main()
{
FILE* ptrf = NULL;
char arr[40] = { 0 };
if ((ptrf = fopen("D:\\Program Files (x86)\\作業(yè)文檔\\行者視覺(jué)組第五次培訓(xùn)\\行者視覺(jué)組第五次培訓(xùn)\\2.txt", "w")) == NULL)
{
perror("fopen");
return 1;
}
int i = 0;
for (i = 0; i< 6; i++)
{
scanf("%s",arr);
fputs(arr,ptrf);
fputs("\n",ptrf);
}
printf("文件寫(xiě)入成功\n");
fclose(ptrf);
ptrf = NULL;
return 0;
}
注意文件打開(kāi)方式用 "w"
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧