版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第13章
文
件在程序運(yùn)行時(shí),程序本身和數(shù)據(jù)一般都存放在內(nèi)存中。當(dāng)程序運(yùn)行結(jié)束后,存放在內(nèi)存中的數(shù)據(jù)被釋放。如果需要長(zhǎng)期保存程序運(yùn)行所需的原始數(shù)據(jù),或程序運(yùn)行產(chǎn)生的結(jié)果,就必須以文件形式存儲(chǔ)到外部存儲(chǔ)介質(zhì)上。13.1C語(yǔ)言文件概述13.2文件的打開(kāi)與關(guān)閉13.3文件的讀寫操作13.4位置指針與文件定位13.5出錯(cuò)檢測(cè)[Return]
13.1C語(yǔ)言文件概述1.文件與文件名
文件是指存放在外部存儲(chǔ)介質(zhì)上的數(shù)據(jù)集合。為標(biāo)識(shí)一個(gè)文件,每個(gè)文件都必須有一個(gè)文件名,其一般結(jié)構(gòu)為:主文件名[.擴(kuò)展名]
文件命名規(guī)則,遵循操作系統(tǒng)的約定。2.文件分類可以從不同的角度對(duì)文件進(jìn)行分類:(1)根據(jù)文件的內(nèi)容,可分為程序文件和數(shù)據(jù)文件,程序文件又可分為源文件、目標(biāo)文件和可執(zhí)行文件。(2)根據(jù)文件的組織形式,可分為順序存取文件和隨機(jī)存取文件。(3)根據(jù)文件的存儲(chǔ)形式,可分為ASCII碼文件和二進(jìn)制文件。ASCII碼文件的每1個(gè)字節(jié)存儲(chǔ)1個(gè)字符,因而便于對(duì)字符進(jìn)行逐個(gè)處理。但一般占用存儲(chǔ)空間較多,而且要花費(fèi)轉(zhuǎn)換時(shí)間(二進(jìn)制與ASCII碼之間的轉(zhuǎn)換)。二進(jìn)制文件是把內(nèi)存中的數(shù)據(jù),原樣輸出到磁盤文件中??梢怨?jié)省存儲(chǔ)空間和轉(zhuǎn)換時(shí)間,但1個(gè)字節(jié)并不對(duì)應(yīng)1個(gè)字符,不能直接輸出字符形式。3.讀文件與寫文件所謂讀文件是指,將磁盤文件中的數(shù)據(jù)傳送到計(jì)算機(jī)內(nèi)存的操作。所謂寫文件是指,從計(jì)算機(jī)內(nèi)存向磁盤文件中傳送數(shù)據(jù)的操作。6.ANSIC的緩沖文件系統(tǒng)所謂緩沖文件系統(tǒng)是指,系統(tǒng)自動(dòng)地在內(nèi)存區(qū)為每個(gè)正在使用的文件開(kāi)辟一個(gè)緩沖區(qū)。從內(nèi)存向磁盤輸出數(shù)據(jù)時(shí),必須首先輸出到緩沖區(qū)中。待緩沖區(qū)裝滿后,再一起輸出到磁盤文件中。從磁盤文件向內(nèi)存讀入數(shù)據(jù)時(shí),則正好相反:首先將一批數(shù)據(jù)讀入到緩沖區(qū)中,再?gòu)木彌_區(qū)中將數(shù)據(jù)逐個(gè)送到程序數(shù)據(jù)區(qū)。[Return]13.2文件的打開(kāi)與關(guān)閉對(duì)文件進(jìn)行操作之前,必須先打開(kāi)該文件;使用結(jié)束后,應(yīng)立即關(guān)閉,以免數(shù)據(jù)丟失。C語(yǔ)言規(guī)定了標(biāo)準(zhǔn)輸入輸出函數(shù)庫(kù),用fopen()函數(shù)打開(kāi)一個(gè)文件,用fclose()函數(shù)關(guān)閉一個(gè)文件。
13.2.1文件的打開(kāi)──fopen()函數(shù)1.用法:FILE*fopen("文件名","操作方式");2.功能:返回一個(gè)指向指定文件的指針。3.函數(shù)原型:stdio.h。注:對(duì)文件操作的庫(kù)函數(shù),函數(shù)原型均在頭文件stdio.h中。后續(xù)函數(shù)不再贅述。(1)“文件名”是指要打開(kāi)(或創(chuàng)建)的文件名。如果使用字符數(shù)組(或字符指針),則不使用雙引號(hào)。(2)“操作方式”如表12-1所示。例如,F(xiàn)ILE*fp;fp=fopen("data.99","r");3.說(shuō)明(1)如果不能實(shí)現(xiàn)打開(kāi)指定文件的操作,則fopen()函數(shù)返回一個(gè)空指針NULL(其值在頭文件stdio.h中被定義為0)。為增強(qiáng)程序的可靠性,常用下面的方法打開(kāi)一個(gè)文件:
if((fp=fopen("文件名","操作方式"))==NULL){printf("cannotopenthisfile\n");exit(0);}使用二進(jìn)制文件時(shí),內(nèi)存中的數(shù)據(jù)形式與數(shù)據(jù)文件中的形式完全一樣,就不再進(jìn)行轉(zhuǎn)換。(4)有些C編譯系統(tǒng),可能并不完全提供上述對(duì)文件的操作方式,或采用的表示符號(hào)不同,請(qǐng)注意所使用系統(tǒng)的規(guī)定。(5)在程序開(kāi)始運(yùn)行時(shí),系統(tǒng)自動(dòng)打開(kāi)三個(gè)標(biāo)準(zhǔn)文件,并分別定義了文件指針:1)標(biāo)準(zhǔn)輸入文件——stdin:指向終端輸入(一般為鍵盤)。如果程序中指定要從stdin所指的文件輸入數(shù)據(jù),就是從終端鍵盤上輸入數(shù)據(jù)。2)標(biāo)準(zhǔn)輸出文件——stdout:指向終端輸出(一般為顯示器)。3)標(biāo)準(zhǔn)錯(cuò)誤文件——stderr:指向終端標(biāo)準(zhǔn)錯(cuò)誤輸出(一般為顯示器)。13.2.2文件的關(guān)閉──fcolse()函數(shù)1.用法:intfclose(FILE*文件指針);2.功能:關(guān)閉“文件指針”所指向的文件。如果正常關(guān)閉了文件,則函數(shù)返回值為0;否則,返回值為非0。例如,fclose(fp);/*關(guān)閉fp所指向的文件*/[Return]13.3文件的讀寫操作文件打開(kāi)之后,就可以對(duì)它進(jìn)行讀與寫的操作了。13.3.1讀/寫文件中的一個(gè)字符
13.3.2讀/寫一個(gè)字符串13.3.3讀/寫一個(gè)數(shù)據(jù)塊13.3.4對(duì)文件進(jìn)行格式化讀/寫13.3.5讀/寫函數(shù)的選用原則
[Return]if((fp=fopen(argv[1],"w"))==NULL) /*打開(kāi)文件失敗*/{printf("cannotopenthisfile\n");exit(0);}/*輸入字符,并存儲(chǔ)到指定文件中*/for(;(ch=getchar())!='@';)fputc(ch,fp); /*輸入字符并存儲(chǔ)到文件中*/fclose(fp); /*關(guān)閉文件*/} [程序演示]程序運(yùn)行情況:abcdefg1234567@←┘庫(kù)函數(shù)fputc():1)用法:intfputc(字符數(shù)據(jù),文件指針);其中“字符數(shù)據(jù)”,既可以是字符常量,也可以是字符變量。2)功能:將字符數(shù)據(jù)輸出到“文件指針”所指向的文件中去,同時(shí)將讀寫位置指針向前移動(dòng)1個(gè)字節(jié)(即指向下一個(gè)寫入位置)。如果輸出成功,則函數(shù)返回值就是輸出的字符數(shù)據(jù);否則,返回一個(gè)符號(hào)常量EOF(其值在頭文件stdio.h中,被定義為-1)。2.從文件中讀入一個(gè)字符──fgetc()函數(shù)和feof()函數(shù)[案例13.2]順序顯示[案例13.1]創(chuàng)建的磁盤ASCII碼文件。/*案例代碼文件名:AL12_2.C*//*程序功能:順序顯示一個(gè)磁盤ASCII碼文件*//*參數(shù):帶參主函數(shù),使用格式:可執(zhí)行文件名源文件名*/#include"stdio.h"main(intargc,char*argv[]){FILE*fp;charch;if(argc!=2) /*參數(shù)個(gè)數(shù)不對(duì)*/{printf("thenumberofargumentsnotcorrect\n");printf(“\nUsage:可執(zhí)行文件名源文件名");exit(0);}(1)庫(kù)函數(shù)fgetc()1)用法:intfgetc(文件指針);2)功能:從“文件指針”所指向的文件中,讀入一個(gè)字符,同時(shí)將讀寫位置指針向前移動(dòng)1個(gè)字節(jié)(即指向下一個(gè)字符)。該函數(shù)無(wú)出錯(cuò)返回值。例如,fgetc(fp)表達(dá)式,從文件fp中讀一個(gè)字符,同時(shí)將fp的讀寫位置指針向前移動(dòng)到下一個(gè)字符。(2)關(guān)于符號(hào)常量EOF在對(duì)ASCII碼文件執(zhí)行讀入操作時(shí),如果遇到文件尾,則讀操作函數(shù)返回一個(gè)文件結(jié)束標(biāo)志EOF(其值在頭文件stdio.h中被定義為-1)。在對(duì)二進(jìn)制文件執(zhí)行讀入操作時(shí),必須使用庫(kù)函數(shù)feof()來(lái)判斷是否遇到文件尾。[案例13.3]實(shí)現(xiàn)制作ASCII碼文件副本的功能。/*案例代碼文件名:AL12_2.C*//*程序功能:制作ASCII碼文件的副本*//*使用格式:可執(zhí)行文件名源文件名目標(biāo)文件名*/#include"stdio.h"main(intargc,char*argv[]){FILE*input,*output; /*input:源文件指針,output:目標(biāo)文件指針*/charch;if(argc!=3)/*參數(shù)個(gè)數(shù)不對(duì)*/{printf("thenumberofargumentsnotcorrect\n");printf("\nUsage:可執(zhí)行文件名source-filedest-file");exit(0);}if((fp=fopen(argv[1],"r"))==NULL) /*打開(kāi)源文件失敗*/{printf("cannotopensourcefile\n");exit(0);}if((fp=fopen(argv[2],"w"))==NULL)/*創(chuàng)建目標(biāo)文件失敗*/{printf("cannotcreatedestinationfile\n");exit(0);}/*復(fù)制源文件到目標(biāo)文件中*/for(;(!feof(input));)fputc(fgetc(input),output);fclose(input);fclose(output); /*關(guān)閉源文件和目標(biāo)文件*/} [程序演示]13.3.2讀/寫一個(gè)字符串──fgets()和fputs()[案例13.4]將鍵盤上輸入的一個(gè)長(zhǎng)度不超過(guò)80的字符串,以ASCII碼形式存儲(chǔ)到一個(gè)磁盤文件中;然后再輸出到屏幕上。/*案例代碼文件名:AL12_4.C*//*參數(shù):可執(zhí)行文件名要?jiǎng)?chuàng)建的磁盤文件名*/#include"stdio.h"main(intargc,char*argv[]){FILE*fp;charstring[81]; /*字符數(shù)組用于暫存輸入輸出的字符串*/if(argc>2)/*參數(shù)太多,提示出錯(cuò)*/{printf("Toomanyparameters…\n\n"); printf("Usage:可執(zhí)行文件名\n");exit(0);}if(argc==1) /*缺磁盤文件名,提示輸入*/{printf("Inputthe:");gets(string); /*借用string暫存輸入的文件名*/argv[1]=(char*)malloc(strlen(string)+1);/*給文件名參數(shù)申請(qǐng)內(nèi)存空間*/strcpy(argv[1],string);/*復(fù)制文件名到形參中*/}if((fp=fopen(argv[1],"w"))==NULL) /*打開(kāi)文件失敗*/{printf("cannotopenthisfile\n"); exit(0);}/*從鍵盤上輸入字符串,并存儲(chǔ)到指定文件中*/printf("Inputastring:");gets(string); /*從鍵盤上輸入字符串*/fputs(string,fp); /*存儲(chǔ)到指定文件*/fclose(fp);/*重新打開(kāi)文件,讀出其中的字符串,并輸出到屏幕上*/if((fp=fopen(argv[1],"r"))==NULL) /*打開(kāi)文件失敗*/{printf("cannotopenthisfile\n");exit(0);}fgets(string,strlen(string)+1,fp); /*從文件中讀一個(gè)字符串*/printf("Outputthestring:");puts(string); /*將字符串輸出到屏幕上*/fclose(fp);} [程序演示]
(1)為增強(qiáng)程序的可靠性,程序中對(duì)參數(shù)過(guò)多的情況,提示出錯(cuò)、并終止程序運(yùn)行;而遺漏文件名時(shí),提示用戶輸入。同時(shí),為增強(qiáng)程序的人機(jī)交互性,凡是需要用戶輸入數(shù)據(jù)的地方,都設(shè)置提示輸入的信息;凡是輸出數(shù)據(jù)的地方,都設(shè)置輸出說(shuō)明信息。13.3.3讀/寫一個(gè)數(shù)據(jù)塊──fread()和fwrite()實(shí)際應(yīng)用中,常常要求1次讀/寫1個(gè)數(shù)據(jù)塊。為此,ANSIC標(biāo)準(zhǔn)設(shè)置了fread()和fwrite()函數(shù)。1.用法:intfread(void*buffer,intsize,intcount,F(xiàn)ILE*fp);intfwrite(void*buffer,intsize,intcount,F(xiàn)ILE*fp);
2.功能:fread()──從fp所指向文件的當(dāng)前位置開(kāi)始,一次讀入size個(gè)字節(jié),重復(fù)count次,并將讀入的數(shù)據(jù)存放到從buffer開(kāi)始的內(nèi)存中;同時(shí),將讀寫位置指針向前移動(dòng)size*count個(gè)字節(jié)。其中,buffer是存放讀入數(shù)據(jù)的起始地址(即存放何處)。fwrite()──從buffer開(kāi)始,一次輸出size個(gè)字節(jié),重復(fù)count次,并將輸出的數(shù)據(jù)存放到fp所指向的文件中;同時(shí),將讀寫位置指針向前移動(dòng)size*count個(gè)字節(jié)。其中,buffer是要輸出數(shù)據(jù)在內(nèi)存中的起始地址(即從何處開(kāi)始輸出)。如果調(diào)用fread()或fwrite()成功,則函數(shù)返回值等于count。fread()和fwrite()函數(shù),一般用于二進(jìn)制文件的處理。[Return]13.3.5讀/寫函數(shù)的選用原則從功能角度來(lái)說(shuō),fread()和fwrite()函數(shù)可以完成文件的任何數(shù)據(jù)讀/寫操作。但為方便起見(jiàn),依下列原則選用:1.讀/寫1個(gè)字符(或字節(jié))數(shù)據(jù)時(shí):選用fgetc()和fputc()函數(shù)。2.讀/寫1個(gè)字符串時(shí):選用fgets()和fputs()函數(shù)。3.讀/寫1個(gè)(或多個(gè))不含格式的數(shù)據(jù)時(shí):選用fread()和fwrite()函數(shù)。4.讀/寫1個(gè)(或多個(gè))含格式的數(shù)據(jù)時(shí):選用fscanf()和fprintf()函數(shù)。[Return]13.4位置指針與文件定位文件中有一個(gè)讀寫位置指針,指向當(dāng)前的讀寫位置。每次讀寫1個(gè)(或1組)數(shù)據(jù)后,系統(tǒng)自動(dòng)將位置指針移動(dòng)到下一個(gè)讀寫位置上。
如果想改變系統(tǒng)這種讀寫規(guī)律,可使用有關(guān)文件定位的函數(shù)。
13.4.1位置指針復(fù)位函數(shù)rewind()1.用法:intrewind(文件指針);2.功能:使文件的位置指針?lè)祷氐轿募^。13.4.2隨機(jī)讀寫與fseek()函數(shù)對(duì)于流式文件,既可以順序讀寫,也可隨機(jī)讀寫,關(guān)鍵在于控制文件的位置指針。
所謂順序讀寫是指,讀寫完當(dāng)前數(shù)據(jù)后,系統(tǒng)自動(dòng)將文件的位置指針移動(dòng)到下一個(gè)讀寫位置上。所謂隨機(jī)讀寫是指,讀寫完當(dāng)前數(shù)據(jù)后,可通過(guò)調(diào)用fseek()函數(shù),將位置指針移動(dòng)到文件中任何一個(gè)地方。1.用法:intfseek(文件指針,位移量,參照點(diǎn));2.功能:將指定文件的位置指針,從參照點(diǎn)開(kāi)始,移動(dòng)指定的字節(jié)數(shù)。(1)參照點(diǎn):用0(文件頭)、1(當(dāng)前位置)和2(文件尾)表示。在ANSIC標(biāo)準(zhǔn)中,還規(guī)定了下面的名字:SEEK_SET──文件頭,SEEK_CUR──當(dāng)前位置,SEEK_END──文件尾(2)位移量:以參照點(diǎn)為起點(diǎn),向前(當(dāng)位移量>0時(shí))或后(當(dāng)位移量<0時(shí))移動(dòng)的字節(jié)數(shù)。在ANS
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- Unit 2 Let's talk teens Reading 說(shuō)課稿-2024-2025學(xué)年高中英語(yǔ)牛津譯林版(2020)必修第一冊(cè)
- Unit 6 Section B 1a-2b說(shuō)課稿 2024-2025學(xué)年人教版(2024)七年級(jí)英語(yǔ)上冊(cè)
- 數(shù)控模具知識(shí)培訓(xùn)課件
- 江蘇省蘇州市新區(qū)2024-2025學(xué)年八年級(jí)上學(xué)期期末質(zhì)量監(jiān)測(cè)歷史卷(含答案)
- 貴州師范大學(xué)《VB語(yǔ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 貴州黔南科技學(xué)院《提案制作與談判技巧》2023-2024學(xué)年第一學(xué)期期末試卷
- DB21-T 4078.4-2024 外來(lái)入侵植物監(jiān)測(cè)技術(shù)規(guī)程 第4部分:刺蒼耳
- Unit 4 What can you do(說(shuō)課稿)-2023-2024學(xué)年人教PEP版英語(yǔ)五年級(jí)上冊(cè)
- 2024版噪聲污染控制工程協(xié)議協(xié)議版B版
- 貴州工貿(mào)職業(yè)學(xué)院《湖南傳統(tǒng)民居》2023-2024學(xué)年第一學(xué)期期末試卷
- JJF(陜) 049-2021 變壓器交流阻抗參數(shù)測(cè)試儀校準(zhǔn)規(guī)范
- 詞語(yǔ)理解-2025年中考語(yǔ)文專項(xiàng)復(fù)習(xí)(遼寧專用)(原卷版)
- 娛樂(lè)場(chǎng)所突發(fā)事件應(yīng)急措施及疏散預(yù)案(三篇)
- 八大危險(xiǎn)作業(yè)安全培訓(xùn)考核試卷
- 老年焦慮癥的護(hù)理
- 2024年白山客運(yùn)從業(yè)資格證考試題庫(kù)
- 中國(guó)商貿(mào)文化商道
- 臨港新片區(qū)規(guī)劃介紹
- 2024年云南省公務(wù)員錄用考試《行測(cè)》真題及答案解析
- 廢氣處理系統(tǒng)改造及廢水處理系統(tǒng)改造項(xiàng)目可行性研究報(bào)告
- 山東省濟(jì)寧市2023-2024學(xué)年高一上學(xué)期2月期末考試化學(xué)試題(解析版)
評(píng)論
0/150
提交評(píng)論