2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩52頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、C語(yǔ)言程序設(shè)計(jì)—提高篇,,第3章 文件,內(nèi)容概述,文件分類  緩沖文件系統(tǒng) 文件的指針 文件打開(kāi)與關(guān)閉 文件應(yīng)用,教學(xué)目標(biāo),1.概述文件的概念,非緩沖文件系統(tǒng)和緩沖文件系統(tǒng); 2.描述文件類型指針的概念及定義方法;3.正確進(jìn)行文件的打開(kāi)和關(guān)閉操作,及對(duì)打開(kāi)和關(guān)閉操作的錯(cuò)誤處理;4.正確使用文件的讀寫操作,包括基于字節(jié),數(shù)據(jù)項(xiàng)等的讀寫操作;5.牢記文件的隨機(jī)讀寫方法;6.正確使用文件訪問(wèn)的錯(cuò)誤檢測(cè)及處理方法;,文件是指

2、存儲(chǔ)在外部介質(zhì)上,且按文件名訪問(wèn)的一組信息序列,①文本文件(字符代碼文件或ASCII代碼文件)  由一個(gè)一個(gè)字符組成,每一個(gè)字符用一個(gè)ASCII代碼表示,如123.45以ASCII代碼形式存儲(chǔ)到磁盤需要6個(gè)字節(jié)?!√攸c(diǎn):可通過(guò)顯示器或打印機(jī)顯示,即可讀,比較直觀。,,3.1 文件分類,②非文本文件(二進(jìn)制文件) 是指以數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式原樣輸出存儲(chǔ)到磁盤上的文件。如123.45在內(nèi)存中以浮點(diǎn)數(shù)形式存儲(chǔ)占4個(gè)字節(jié),不管一個(gè)實(shí)數(shù)多

3、大都占4個(gè)字節(jié)。 特點(diǎn):節(jié)省存儲(chǔ)空間,輸入輸出無(wú)需轉(zhuǎn)換,速度快,不便閱讀。,說(shuō)明:?、僖粋€(gè)C文件是一個(gè)字節(jié)流或二進(jìn)制流,它把數(shù)據(jù)看作是一連串的字符序列(字節(jié)),而不考慮記錄的界限,即C文件并不是由記錄組成的。?、谟捎趯?duì)文件的操作要與各種外部設(shè)備發(fā)生聯(lián)系,因此對(duì)文件的輸入輸出(讀寫)過(guò)程是通過(guò)操作系統(tǒng)來(lái)實(shí)現(xiàn)的。對(duì)文件的讀寫都是通過(guò)標(biāo)準(zhǔn)的I/O函數(shù)進(jìn)行的。,,,3.2緩沖文件系統(tǒng)(標(biāo)準(zhǔn)IO)和非緩沖文件系統(tǒng),①緩沖文件系統(tǒng)(又稱標(biāo)準(zhǔn)或

4、高層文件系統(tǒng))  特點(diǎn):對(duì)程序中的每一個(gè)文件都在內(nèi)存中開(kāi)辟一個(gè)“緩沖區(qū)”?!∽饔茫簭拇疟P文件讀入的數(shù)據(jù)先到“輸入緩沖區(qū)”中,然后再?gòu)木彌_區(qū)依次將數(shù)據(jù)送給接收變量。,在向磁盤文件輸出數(shù)據(jù)時(shí),先將程序數(shù)據(jù)區(qū)中變量或表達(dá)式的值送到“輸出文件緩沖區(qū)”中,待裝滿后才一起輸出給磁盤文件。目的減少對(duì)磁盤的讀寫次數(shù),即一次可以讀入一批數(shù)據(jù)或輸出一批數(shù)據(jù)。,②非緩沖文件系統(tǒng):不由系統(tǒng)自動(dòng)設(shè)置所需緩沖區(qū),而由用戶根據(jù)需要設(shè)置。③新的ANSI標(biāo)準(zhǔn)只

5、建議使用緩沖系統(tǒng),并對(duì)緩沖文件系統(tǒng)的功能進(jìn)行了擴(kuò)充,使既能用于處理字符代碼文件,也能處理二進(jìn)制文件。,,3.3 文件類型指針,對(duì)文件的操作是通過(guò)文件指針實(shí)現(xiàn)的,關(guān)鍵的概念是“文件指針” ?!≌{(diào)用一個(gè)文件需要的信息:文件當(dāng)前讀寫的位置;與該文件對(duì)應(yīng)的內(nèi)存緩沖區(qū)的地址;緩沖區(qū)未被處理的字符數(shù)(字符指針);文件的操作方式。,系統(tǒng)內(nèi)部定義了一個(gè)FILE的結(jié)構(gòu)類型。 typedef struct{int_fd;//文件號(hào)

6、int_cleft;//緩沖區(qū)中剩余的字符int_mode;//文件操作方式char*_nextc;//下一個(gè)字符位置char*_buff;//文件緩沖區(qū)位置}FILE;,FILE類型保存被使用的文件的有關(guān)信息所有的文件操作都需要FILE類型的指針FILE是庫(kù)文件中定義的結(jié)構(gòu)體的別名,FILE 定義在stdio.h中注意不要寫成struct FILE舉例FILE *fp;,,3.4文件的打開(kāi)與關(guān)

7、閉,文件必須先打開(kāi)后,并及時(shí)關(guān)閉,1)打開(kāi)文件:是在用戶程序和操作系統(tǒng)之間建立聯(lián)系,程序要把操作的文件的信息通知操作系統(tǒng),如文件名、文件操作方式(讀寫)。,讀文件:需要先確定此文件是否存在,并將讀當(dāng)前位置設(shè)定為文件的開(kāi)頭。寫文件:需要檢查原來(lái)是否有同名文件,如有則將該文件的原有內(nèi)容刪除,如無(wú)同名文件就建立一個(gè)新文件,然后將寫當(dāng)前位置設(shè)定于文件的開(kāi)頭,以便從文件開(kāi)頭寫入數(shù)據(jù)。,文件的打開(kāi)方式:調(diào)用方式fopen("文件名

8、","文件操作方式");功能:返回一個(gè)指向該文件的指針或錯(cuò)誤標(biāo)志NULL。,為避免出錯(cuò),常用以下方法來(lái)打開(kāi)文件FILE *fp;if((fp=fopen(“文件名”,“使用文件方式”))==NULL){ printf(”cannot open this file.\n”); exit(0); //正常中止程序},文件的打開(kāi)模式,文件的打開(kāi)舉例,FILE *fp1, *fp2, *fp3;

9、char filename[]="file3.dat";/* 以文本只讀方式打開(kāi)file1 */if (!(fp1=fopen("file1", "r"))) { printf("Cannot Open This File!\n"); exit(0); /* 退出程序 */ }/* 以二進(jìn)制讀寫方式打開(kāi)file2.txt */

10、fp2=fopen("C:\\HOME\\file2.txt", "rb+");/* 以二進(jìn)制讀寫方式打開(kāi)file3.dat */fp3=fopen(filename, "a+b");,2)文件的關(guān)閉:調(diào)用方式fclose(文件指針變量);功能:關(guān)閉一個(gè)已打開(kāi)的文件(釋放文件信息區(qū))返回值:若成功,返回0,若出錯(cuò),返回EOF(-1)3)文件結(jié)尾標(biāo)志: EOF,說(shuō)

11、明:釋放文件的有關(guān)信息區(qū);將輸出文件緩沖區(qū)的內(nèi)容(無(wú)論緩沖區(qū)是否為滿)都輸出寫入文件,然后關(guān)閉文件,這樣可防止丟失本來(lái)應(yīng)寫入文件的數(shù)據(jù)。不用的文件應(yīng)關(guān)閉,防止數(shù)據(jù)破壞丟失,文件應(yīng)用示例例1:格式化的輸入輸出。fprintf(fp,格式字符串,輸出項(xiàng)表列)功能:將輸出按格式串規(guī)定輸出到指定文件。fscanf(fp,格式字符串,輸入項(xiàng)表列)功能:從fp所指文件按格式串讀入數(shù)據(jù)。函數(shù)執(zhí)行成功返回讀得的數(shù)據(jù)項(xiàng)個(gè)數(shù);若在讀第1

12、項(xiàng)前已到達(dá)文件結(jié)束處,則返回EOF。,#include #include #include void main(){FILE *fp;char name[10];int num;float score;if((fp=fopen("file3.txt","w+"))==NULL){printf("cannot open this

13、file.\n");exit(0);}printf("enter name,num,score:");scanf("%s %d %f",name,&num,&score);,while(strlen(name)>1){fprintf(fp,"%s %d %f\n",name,num,score);prin

14、tf("enter name,num,score:");scanf("%s %d %f",name,&num,&score);}rewind(fp);while(fscanf(fp,"%s %d %f",name,&num, &score) !=EOF)printf("%-10s,%6d,%6.2f

15、\n",name,num,score);fclose(fp);},輸入: enter name,num,score: zhangsan050190 enter name,num,score: liming050285 enter name,num,score: gaofei050395 enter name,num,score: 000,輸出:zhangsan50190.0

16、0 liming50285.00gaofei50395.00,例2:具有文件拷貝功能的程序filecopy.c?!≌f(shuō)明兩個(gè)問(wèn)題:命令行參數(shù)的應(yīng)用和文件的字符輸入與輸出應(yīng)用。fgetc(fp)功能:從指定文件讀入一個(gè)字符。fputc(ch,fp)功能:把一個(gè)字符寫到指定文件中去。,#include #include #include void filecopy(FILE *fp1,FILE *

17、fp2){char c;while((c=fgetc(fp1))!=EOF)fputc(c,fp2);},void main(int argc,char *argv[]){FILE *fp1,*fp2;//void filecopy(FILE *fp1,FILE *fp2);if(argc>1){if((fp1=fopen(*++argv,"r"))==NUL

18、L){printf("can't fopen %s\n",*argv);exit(0);}if((fp2=fopen(*++argv,"w"))==NULL){printf("can't fopen %s\n",*argv);exit(0);}filecopy(fp1,fp2);}},例3

19、:文件的字符串的輸入輸出處理?!gets(str,n,fp)字符串輸入函數(shù)其功能是從fp指定的文件中讀取一個(gè)串,若滿足以下條件讀取結(jié)束:①已讀取n-1個(gè)字符, ②當(dāng)前讀取到的字符是回車符, ③已讀取到文件尾。讀取的字符個(gè)數(shù)至多n-1個(gè),余下的一個(gè)字節(jié)空間作為加“\0”串結(jié)束符。讀取回車符時(shí),也作為一個(gè)字符送入由str所指的內(nèi)存緩沖區(qū)。然后再加一個(gè)字符結(jié)束符“\0”str為數(shù)組名或字符指針;n為讀取字符個(gè)數(shù),例3:文

20、件的字符串的輸入輸出處理?!puts(str,fp)字符串輸出(寫)函數(shù)其功能是將str所指定的字符串寫到fp指向的文件中。與fgets()函數(shù)在輸入字符串自動(dòng)加“\0”特性對(duì)應(yīng),fputs ()函數(shù)在將C字符串寫入文件時(shí)其末尾的“\0”字符自動(dòng)舍去。,#include #include #include void main(){FILE*fp;char str[16]; if(fp=open(“file

21、2.txt”,”w”))==NULL{printf(“cannot open this file.\n”);exit(0);}while(strlen(gets(str))>0)fputs(str,fp);fclose(fp);if(fp=open(“file2.txt”,”r”))==NULL{printf(“cannot open this file.\n”);exit(0);}

22、while(fgets(str,16,fp)!=NULL)printf(“%s\n”,str);fclose(fp);},文件的讀寫,例4:數(shù)據(jù)塊(二進(jìn)制形式)的讀寫 fread(buffer,size,count,fp)功能:從指定文件讀入count個(gè)大小為size的字節(jié)數(shù)據(jù)塊,存入buffer所指存儲(chǔ)單元。返回所讀的數(shù)據(jù)項(xiàng)個(gè)數(shù),如遇文件結(jié)束或出錯(cuò)返回0。fwrite(buffer,size,count,f

23、p)功能: 從buffer所指存儲(chǔ)單元的數(shù)據(jù)取size ×count個(gè)字節(jié)送fp所指文件。返回寫到fp所指文件中的數(shù)據(jù)項(xiàng)的個(gè)數(shù)。,例4:數(shù)據(jù)塊(二進(jìn)制形式)的讀寫 fread(buffer,size,count,fp)fwrite(buffer,size,count,fp)說(shuō)明:buffer為輸入輸出在內(nèi)存中存放的首地址;size為讀、寫的字節(jié)數(shù),即數(shù)據(jù)塊的大小;count為輸入輸出的數(shù)據(jù)項(xiàng)的個(gè)數(shù);f

24、read()和fwrite()用于二進(jìn)制文件的輸入輸出。,#include #include #define SIZE 4struct student{char name[10];int num,age;char addr[15];}stud[SIZE];void save_load(){FILE *fp;int i;if((fp=fopen("stu_list","

25、wb+"))==NULL){printf("cannot open file.\n");exit(0);},for(i=0;i<SIZE;i++){if(fwrite(&stud[i],sizeof(struct student),1,fp)!=1){printf("file write error!\n");exit

26、(0);}}rewind(fp);for(i=0;i<SIZE;i++){if(fread(&stud[i],sizeof(struct student),1,fp)!=0)printf("%-10s %4d %4d %-15s\n", stud[i].name,stud[i].num, stud[i].age, stud[i].addr);}},輸入

27、: zhang100119room_101 li1002 19room_102 wang100321room_103 zhao100421room_104,輸出: zhang100119room_101 li1002 19room_102 wang100321room_103 zhao100421room_104,void main(){int i;f

28、or(i=0;i<SIZE;i++)scanf("%s %d %d %s", stud[i].name, &stud[i].num,&stud[i].age, stud[i].addr);save_load();},回顧:fgetc( ), fputc( ),fgets( ), fputs( ),fscanf( ), fprintf( ),,這些函數(shù)都是按順序讀/寫文件,3

29、.5 文件的隨機(jī)讀寫,解決的辦法:把文件指針移到指定的位置即可。,關(guān)鍵步驟:文件的定位。,3.5 文件的隨機(jī)讀寫,問(wèn)題:要求打開(kāi)文件后,對(duì)指定位置上的數(shù)據(jù)進(jìn)行讀寫操作,減少一些不必要的中間環(huán)節(jié)。,一、對(duì)文件隨機(jī)存取的思想,? 對(duì)一個(gè)文件流,有主觀的愿望要取指定位置的記錄和更新指定位置的記錄。,如:對(duì)一個(gè)文件流,可以有兩種目的:,? 從第i個(gè)字節(jié)開(kāi)始,讀取k個(gè)字節(jié)的內(nèi)容,? 把k個(gè)字節(jié)的內(nèi)容寫到從第i個(gè)字節(jié)開(kāi)始后,存在的問(wèn)題:讀取的內(nèi)容是

30、否滿足我們的要求?,,二、隨機(jī)存取的應(yīng)用,? 隨機(jī)存取文件適合于具有固定長(zhǎng)度記錄的文件,程序可以很方便的訪問(wèn)到指定位置處的記錄。,訪問(wèn),,三、隨機(jī)存取的目的,1. 方便、快捷,2. 只改變指定位置后的固定長(zhǎng)度字節(jié)的內(nèi)容(不會(huì)破壞其它的數(shù)據(jù)),讀取、修改等,,問(wèn)題的實(shí)質(zhì):把指定的數(shù)據(jù)寫到文件流中指定的位置。,問(wèn)題的關(guān)鍵:把文件指針定位到文件流中指定的位置。,步驟:定位??寫數(shù)據(jù),四、向隨機(jī)文件中隨機(jī)地寫入數(shù)據(jù),五、文件定位函數(shù),fseek

31、(文件指針變量、 位移量、起始點(diǎn)),注: 起始點(diǎn)的取值只有3種:,位移量:以起始點(diǎn)為基點(diǎn)移動(dòng)的字節(jié)數(shù),0 ?? 文件開(kāi)始處,1 ?? 文件位置指針的當(dāng)前位置,2 ?? 文件尾。,,位移量應(yīng)為long型,fseek( )的返回值:,0 ?? 成功,非零 ?? 失敗,例:fseek(fp, 20l, 0);,將位置指針從文件頭移動(dòng)20個(gè)字節(jié),fseek(fp, ?10l, 1);,將位置指針移到離文件尾30個(gè)字節(jié)處,fseek(fp, ?3

32、0l, 2);,將位置從當(dāng)前位置向后移10個(gè)字節(jié),六、位置函數(shù),ftell(文件指針變量);,作用:返回位置指針的當(dāng)前指向,返回值:,,≥0, 文件指針的當(dāng)前指向,?1, 出錯(cuò),例5: 文件data1.txt的內(nèi)容如下:,This is a test.,C語(yǔ)言程序設(shè)計(jì),隨機(jī)讀寫函數(shù)測(cè)試。,要求編寫一程序隨機(jī)讀出指定的記錄。,七、重新定位函數(shù),rewind( 文件指針變量 ),作用:使文件指針?lè)祷氐轿募拈_(kāi)頭,無(wú)返回值,#inclu

33、de #include #include void main( ){FILE *fp;int loc1, loc2;long d=8l;char w;fp=fopen("data1.txt", "r");if (fp==NULL)printf("error\n");else{loc1=fseek(fp,d,0);if

34、(loc1==0){w=fgetc(fp);printf("w=%c\n",w);}},運(yùn)行結(jié)果:,w=a loc2=9 loc2=0,loc2=ftell(fp);rewind(fp);printf("loc2=%d\n",loc2);loc2=ftell(fp);fclose(fp);printf("

35、;loc2=%d\n",loc2);},,?,思考:,若要采用隨機(jī)讀寫的方式讀取一個(gè)漢字,程序如何修改?,提示: 一個(gè)漢字占2個(gè)字節(jié),可使用fgets ( )函數(shù)將要讀出的漢字裝a數(shù)組,讀取的字符個(gè)數(shù)必須為≥3的單數(shù),八、文件操作的錯(cuò)誤檢測(cè),C語(yǔ)言對(duì)于大多數(shù)標(biāo)準(zhǔn)I/O函數(shù)不具有明確的出錯(cuò)信息。,調(diào)用形式:ferror(fp),,文件指針,返回值:,,0: 未出錯(cuò),非0:出錯(cuò),ferror函數(shù)的值是最后一次調(diào)用時(shí)的出錯(cuò)狀

36、態(tài)。,練 習(xí),程序設(shè)計(jì)題:統(tǒng)計(jì)滿足條件x*x+y*y+z*z==2000的所有解的個(gè)數(shù),并將統(tǒng)計(jì)結(jié)果以格式"%d"寫入到新建的文件design.dat。 說(shuō)明:若a、b、c是1個(gè)解,則a、c、b也是1個(gè)解,等等。 #include void main(){ FILE *p; int x,y,z,k=0; // // // // //

37、 // //},p=fopen("design.dat","w");for(x=1;x<=sqrt(2000);x++) for(y=1;y<=sqrt(2000);y++) for(z=1;z<=sqrt(2000);z++) if((x*x+y*y+z*z)==2000) k++;fprintf(p,"%d

38、", k);fclose(p);,練 習(xí),程序設(shè)計(jì)題:在正整數(shù)中找出1個(gè)最小的、被3、5、7、9除余數(shù)分別為1、 3、5、7的數(shù),將該數(shù)以格式"%d"寫到新建文件design.dat。#include #include void main(){ // // // // // // //},FILE *p; int x=0;p=fopen("desig

溫馨提示

  • 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論