




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第13章
文
件在程序運行時,程序本身和數(shù)據(jù)一般都存放在內(nèi)存中。當程序運行結(jié)束后,存放在內(nèi)存中的數(shù)據(jù)被釋放。如果需要長期保存程序運行所需的原始數(shù)據(jù),或程序運行產(chǎn)生的結(jié)果,就必須以文件形式存儲到外部存儲介質(zhì)上。13.1C語言文件概述13.2文件的打開與關(guān)閉13.3文件的讀寫操作13.4位置指針與文件定位13.5出錯檢測[Return]
13.1C語言文件概述1.文件與文件名
文件是指存放在外部存儲介質(zhì)上的數(shù)據(jù)集合。為標識一個文件,每個文件都必須有一個文件名,其一般結(jié)構(gòu)為:主文件名[.擴展名]
文件命名規(guī)則,遵循操作系統(tǒng)的約定。2.文件分類可以從不同的角度對文件進行分類:(1)根據(jù)文件的內(nèi)容,可分為程序文件和數(shù)據(jù)文件,程序文件又可分為源文件、目標文件和可執(zhí)行文件。(2)根據(jù)文件的組織形式,可分為順序存取文件和隨機存取文件。(3)根據(jù)文件的存儲形式,可分為ASCII碼文件和二進制文件。ASCII碼文件的每1個字節(jié)存儲1個字符,因而便于對字符進行逐個處理。但一般占用存儲空間較多,而且要花費轉(zhuǎn)換時間(二進制與ASCII碼之間的轉(zhuǎn)換)。二進制文件是把內(nèi)存中的數(shù)據(jù),原樣輸出到磁盤文件中。可以節(jié)省存儲空間和轉(zhuǎn)換時間,但1個字節(jié)并不對應1個字符,不能直接輸出字符形式。3.讀文件與寫文件所謂讀文件是指,將磁盤文件中的數(shù)據(jù)傳送到計算機內(nèi)存的操作。所謂寫文件是指,從計算機內(nèi)存向磁盤文件中傳送數(shù)據(jù)的操作。6.ANSIC的緩沖文件系統(tǒng)所謂緩沖文件系統(tǒng)是指,系統(tǒng)自動地在內(nèi)存區(qū)為每個正在使用的文件開辟一個緩沖區(qū)。從內(nèi)存向磁盤輸出數(shù)據(jù)時,必須首先輸出到緩沖區(qū)中。待緩沖區(qū)裝滿后,再一起輸出到磁盤文件中。從磁盤文件向內(nèi)存讀入數(shù)據(jù)時,則正好相反:首先將一批數(shù)據(jù)讀入到緩沖區(qū)中,再從緩沖區(qū)中將數(shù)據(jù)逐個送到程序數(shù)據(jù)區(qū)。[Return]13.2文件的打開與關(guān)閉對文件進行操作之前,必須先打開該文件;使用結(jié)束后,應立即關(guān)閉,以免數(shù)據(jù)丟失。C語言規(guī)定了標準輸入輸出函數(shù)庫,用fopen()函數(shù)打開一個文件,用fclose()函數(shù)關(guān)閉一個文件。
13.2.1文件的打開──fopen()函數(shù)1.用法:FILE*fopen("文件名","操作方式");2.功能:返回一個指向指定文件的指針。3.函數(shù)原型:stdio.h。注:對文件操作的庫函數(shù),函數(shù)原型均在頭文件stdio.h中。后續(xù)函數(shù)不再贅述。(1)“文件名”是指要打開(或創(chuàng)建)的文件名。如果使用字符數(shù)組(或字符指針),則不使用雙引號。(2)“操作方式”如表12-1所示。例如,F(xiàn)ILE*fp;fp=fopen("data.99","r");3.說明(1)如果不能實現(xiàn)打開指定文件的操作,則fopen()函數(shù)返回一個空指針NULL(其值在頭文件stdio.h中被定義為0)。為增強程序的可靠性,常用下面的方法打開一個文件:
if((fp=fopen("文件名","操作方式"))==NULL){printf("cannotopenthisfile\n");exit(0);}使用二進制文件時,內(nèi)存中的數(shù)據(jù)形式與數(shù)據(jù)文件中的形式完全一樣,就不再進行轉(zhuǎn)換。(4)有些C編譯系統(tǒng),可能并不完全提供上述對文件的操作方式,或采用的表示符號不同,請注意所使用系統(tǒng)的規(guī)定。(5)在程序開始運行時,系統(tǒng)自動打開三個標準文件,并分別定義了文件指針:1)標準輸入文件——stdin:指向終端輸入(一般為鍵盤)。如果程序中指定要從stdin所指的文件輸入數(shù)據(jù),就是從終端鍵盤上輸入數(shù)據(jù)。2)標準輸出文件——stdout:指向終端輸出(一般為顯示器)。3)標準錯誤文件——stderr:指向終端標準錯誤輸出(一般為顯示器)。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文件的讀寫操作文件打開之后,就可以對它進行讀與寫的操作了。13.3.1讀/寫文件中的一個字符
13.3.2讀/寫一個字符串13.3.3讀/寫一個數(shù)據(jù)塊13.3.4對文件進行格式化讀/寫13.3.5讀/寫函數(shù)的選用原則
[Return]if((fp=fopen(argv[1],"w"))==NULL) /*打開文件失敗*/{printf("cannotopenthisfile\n");exit(0);}/*輸入字符,并存儲到指定文件中*/for(;(ch=getchar())!='@';)fputc(ch,fp); /*輸入字符并存儲到文件中*/fclose(fp); /*關(guān)閉文件*/} [程序演示]程序運行情況:abcdefg1234567@←┘庫函數(shù)fputc():1)用法:intfputc(字符數(shù)據(jù),文件指針);其中“字符數(shù)據(jù)”,既可以是字符常量,也可以是字符變量。2)功能:將字符數(shù)據(jù)輸出到“文件指針”所指向的文件中去,同時將讀寫位置指針向前移動1個字節(jié)(即指向下一個寫入位置)。如果輸出成功,則函數(shù)返回值就是輸出的字符數(shù)據(jù);否則,返回一個符號常量EOF(其值在頭文件stdio.h中,被定義為-1)。2.從文件中讀入一個字符──fgetc()函數(shù)和feof()函數(shù)[案例13.2]順序顯示[案例13.1]創(chuàng)建的磁盤ASCII碼文件。/*案例代碼文件名:AL12_2.C*//*程序功能:順序顯示一個磁盤ASCII碼文件*//*參數(shù):帶參主函數(shù),使用格式:可執(zhí)行文件名源文件名*/#include"stdio.h"main(intargc,char*argv[]){FILE*fp;charch;if(argc!=2) /*參數(shù)個數(shù)不對*/{printf("thenumberofargumentsnotcorrect\n");printf(“\nUsage:可執(zhí)行文件名源文件名");exit(0);}(1)庫函數(shù)fgetc()1)用法:intfgetc(文件指針);2)功能:從“文件指針”所指向的文件中,讀入一個字符,同時將讀寫位置指針向前移動1個字節(jié)(即指向下一個字符)。該函數(shù)無出錯返回值。例如,fgetc(fp)表達式,從文件fp中讀一個字符,同時將fp的讀寫位置指針向前移動到下一個字符。(2)關(guān)于符號常量EOF在對ASCII碼文件執(zhí)行讀入操作時,如果遇到文件尾,則讀操作函數(shù)返回一個文件結(jié)束標志EOF(其值在頭文件stdio.h中被定義為-1)。在對二進制文件執(zhí)行讀入操作時,必須使用庫函數(shù)feof()來判斷是否遇到文件尾。[案例13.3]實現(xiàn)制作ASCII碼文件副本的功能。/*案例代碼文件名:AL12_2.C*//*程序功能:制作ASCII碼文件的副本*//*使用格式:可執(zhí)行文件名源文件名目標文件名*/#include"stdio.h"main(intargc,char*argv[]){FILE*input,*output; /*input:源文件指針,output:目標文件指針*/charch;if(argc!=3)/*參數(shù)個數(shù)不對*/{printf("thenumberofargumentsnotcorrect\n");printf("\nUsage:可執(zhí)行文件名source-filedest-file");exit(0);}if((fp=fopen(argv[1],"r"))==NULL) /*打開源文件失敗*/{printf("cannotopensourcefile\n");exit(0);}if((fp=fopen(argv[2],"w"))==NULL)/*創(chuàng)建目標文件失敗*/{printf("cannotcreatedestinationfile\n");exit(0);}/*復制源文件到目標文件中*/for(;(!feof(input));)fputc(fgetc(input),output);fclose(input);fclose(output); /*關(guān)閉源文件和目標文件*/} [程序演示]13.3.2讀/寫一個字符串──fgets()和fputs()[案例13.4]將鍵盤上輸入的一個長度不超過80的字符串,以ASCII碼形式存儲到一個磁盤文件中;然后再輸出到屏幕上。/*案例代碼文件名:AL12_4.C*//*參數(shù):可執(zhí)行文件名要創(chuàng)建的磁盤文件名*/#include"stdio.h"main(intargc,char*argv[]){FILE*fp;charstring[81]; /*字符數(shù)組用于暫存輸入輸出的字符串*/if(argc>2)/*參數(shù)太多,提示出錯*/{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ù)申請內(nèi)存空間*/strcpy(argv[1],string);/*復制文件名到形參中*/}if((fp=fopen(argv[1],"w"))==NULL) /*打開文件失敗*/{printf("cannotopenthisfile\n"); exit(0);}/*從鍵盤上輸入字符串,并存儲到指定文件中*/printf("Inputastring:");gets(string); /*從鍵盤上輸入字符串*/fputs(string,fp); /*存儲到指定文件*/fclose(fp);/*重新打開文件,讀出其中的字符串,并輸出到屏幕上*/if((fp=fopen(argv[1],"r"))==NULL) /*打開文件失敗*/{printf("cannotopenthisfile\n");exit(0);}fgets(string,strlen(string)+1,fp); /*從文件中讀一個字符串*/printf("Outputthestring:");puts(string); /*將字符串輸出到屏幕上*/fclose(fp);} [程序演示]
(1)為增強程序的可靠性,程序中對參數(shù)過多的情況,提示出錯、并終止程序運行;而遺漏文件名時,提示用戶輸入。同時,為增強程序的人機交互性,凡是需要用戶輸入數(shù)據(jù)的地方,都設(shè)置提示輸入的信息;凡是輸出數(shù)據(jù)的地方,都設(shè)置輸出說明信息。13.3.3讀/寫一個數(shù)據(jù)塊──fread()和fwrite()實際應用中,常常要求1次讀/寫1個數(shù)據(jù)塊。為此,ANSIC標準設(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所指向文件的當前位置開始,一次讀入size個字節(jié),重復count次,并將讀入的數(shù)據(jù)存放到從buffer開始的內(nèi)存中;同時,將讀寫位置指針向前移動size*count個字節(jié)。其中,buffer是存放讀入數(shù)據(jù)的起始地址(即存放何處)。fwrite()──從buffer開始,一次輸出size個字節(jié),重復count次,并將輸出的數(shù)據(jù)存放到fp所指向的文件中;同時,將讀寫位置指針向前移動size*count個字節(jié)。其中,buffer是要輸出數(shù)據(jù)在內(nèi)存中的起始地址(即從何處開始輸出)。如果調(diào)用fread()或fwrite()成功,則函數(shù)返回值等于count。fread()和fwrite()函數(shù),一般用于二進制文件的處理。[Return]13.3.5讀/寫函數(shù)的選用原則從功能角度來說,fread()和fwrite()函數(shù)可以完成文件的任何數(shù)據(jù)讀/寫操作。但為方便起見,依下列原則選用:1.讀/寫1個字符(或字節(jié))數(shù)據(jù)時:選用fgetc()和fputc()函數(shù)。2.讀/寫1個字符串時:選用fgets()和fputs()函數(shù)。3.讀/寫1個(或多個)不含格式的數(shù)據(jù)時:選用fread()和fwrite()函數(shù)。4.讀/寫1個(或多個)含格式的數(shù)據(jù)時:選用fscanf()和fprintf()函數(shù)。[Return]13.4位置指針與文件定位文件中有一個讀寫位置指針,指向當前的讀寫位置。每次讀寫1個(或1組)數(shù)據(jù)后,系統(tǒng)自動將位置指針移動到下一個讀寫位置上。
如果想改變系統(tǒng)這種讀寫規(guī)律,可使用有關(guān)文件定位的函數(shù)。
13.4.1位置指針復位函數(shù)rewind()1.用法:intrewind(文件指針);2.功能:使文件的位置指針返回到文件頭。13.4.2隨機讀寫與fseek()函數(shù)對于流式文件,既可以順序讀寫,也可隨機讀寫,關(guān)鍵在于控制文件的位置指針。
所謂順序讀寫是指,讀寫完當前數(shù)據(jù)后,系統(tǒng)自動將文件的位置指針移動到下一個讀寫位置上。所謂隨機讀寫是指,讀寫完當前數(shù)據(jù)后,可通過調(diào)用fseek()函數(shù),將位置指針移動到文件中任何一個地方。1.用法:intfseek(文件指針,位移量,參照點);2.功能:將指定文件的位置指針,從參照點開始,移動指定的字節(jié)數(shù)。(1)參照點:用0(文件頭)、1(當前位置)和2(文件尾)表示。在ANSIC標準中,還規(guī)定了下面的名字:SEEK_SET──文件頭,SEEK_CUR──當前位置,SEEK_END──文件尾(2)位移量:以參照點為起點,向前(當位移量>0時)或后(當位移量<0時)移動的字節(jié)數(shù)。在ANS
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 12 玩也有學問 第二課時 教學設(shè)計-2024-2025學年道德與法治一年級上冊統(tǒng)編版
- 第2課 諸侯紛爭與變法運動 教學設(shè)計-2023-2024學年高中歷史統(tǒng)編版(2019)必修中外歷史綱要上
- 2024-2025學年高中政治專題2專題復習課教案新人教版選修5
- 第一章 走進信息社會 教學設(shè)計 2023-2024學年粵教版(2019)高中信息技術(shù)必修2
- 第4課《天凈沙·秋思》 教學設(shè)計2024-2025學年統(tǒng)編版語文七年級上冊
- 全國人教版初中信息技術(shù)七年級上冊第二單元第6課三、《加工音頻素材》教學設(shè)計
- 第4單元 15金色的魚鉤(教學設(shè)計)2024-2025學年六年級語文上冊同步教學(統(tǒng)編版)
- 全國河大音像版初中信息技術(shù)七年級上冊第二章第二節(jié)《局域網(wǎng)》教學設(shè)計
- 化工可研報告
- 2025年膠體石墨油劑行業(yè)深度研究分析報告
- (兒科學課件)腎病綜合征
- 光纜線路工程段終版施工圖
- 礦井年度災害預防和處理計劃
- 畢業(yè)論文-基于Java Web的模擬駕??荚囅到y(tǒng)設(shè)計與實現(xiàn)
- MDD指令附錄一 基本要求檢查表2013版
- 新部編人教版四年級下冊道德與法治全冊教案(教學設(shè)計)
- 人美版高中美術(shù)選修:《繪畫》全冊課件【優(yōu)質(zhì)課件】
- 進制轉(zhuǎn)換教學設(shè)計
- 垂直度和跳動形位公差間的關(guān)系及取代應用下
- 單位數(shù)字證書業(yè)務申請表
- 大學物理答案北京郵電大學出版社
評論
0/150
提交評論