c語言程序設計提高篇_第1頁
已閱讀1頁,還剩52頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

3、大都占4個字節(jié)?!√攸c:節(jié)省存儲空間,輸入輸出無需轉換,速度快,不便閱讀。,說明:?、僖粋€C文件是一個字節(jié)流或二進制流,它把數(shù)據看作是一連串的字符序列(字節(jié)),而不考慮記錄的界限,即C文件并不是由記錄組成的。?、谟捎趯ξ募牟僮饕c各種外部設備發(fā)生聯(lián)系,因此對文件的輸入輸出(讀寫)過程是通過操作系統(tǒng)來實現(xiàn)的。對文件的讀寫都是通過標準的I/O函數(shù)進行的。,,,3.2緩沖文件系統(tǒng)(標準IO)和非緩沖文件系統(tǒng),①緩沖文件系統(tǒng)(又稱標準或

4、高層文件系統(tǒng))  特點:對程序中的每一個文件都在內存中開辟一個“緩沖區(qū)”。 作用:從磁盤文件讀入的數(shù)據先到“輸入緩沖區(qū)”中,然后再從緩沖區(qū)依次將數(shù)據送給接收變量。,在向磁盤文件輸出數(shù)據時,先將程序數(shù)據區(qū)中變量或表達式的值送到“輸出文件緩沖區(qū)”中,待裝滿后才一起輸出給磁盤文件。目的減少對磁盤的讀寫次數(shù),即一次可以讀入一批數(shù)據或輸出一批數(shù)據。,②非緩沖文件系統(tǒng):不由系統(tǒng)自動設置所需緩沖區(qū),而由用戶根據需要設置。③新的ANSI標準只

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

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

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

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

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

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

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

12、項前已到達文件結束處,則返回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明兩個問題:命令行參數(shù)的應用和文件的字符輸入與輸出應用。fgetc(fp)功能:從指定文件讀入一個字符。fputc(ch,fp)功能:把一個字符寫到指定文件中去。,#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指定的文件中讀取一個串,若滿足以下條件讀取結束:①已讀取n-1個字符, ②當前讀取到的字符是回車符, ③已讀取到文件尾。讀取的字符個數(shù)至多n-1個,余下的一個字節(jié)空間作為加“\0”串結束符。讀取回車符時,也作為一個字符送入由str所指的內存緩沖區(qū)。然后再加一個字符結束符“\0”str為數(shù)組名或字符指針;n為讀取字符個數(shù),例3:文

20、件的字符串的輸入輸出處理。 fputs(str,fp)字符串輸出(寫)函數(shù)其功能是將str所指定的字符串寫到fp指向的文件中。與fgets()函數(shù)在輸入字符串自動加“\0”特性對應,fputs ()函數(shù)在將C字符串寫入文件時其末尾的“\0”字符自動舍去。,#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ù)據塊(二進制形式)的讀寫 fread(buffer,size,count,fp)功能:從指定文件讀入count個大小為size的字節(jié)數(shù)據塊,存入buffer所指存儲單元。返回所讀的數(shù)據項個數(shù),如遇文件結束或出錯返回0。fwrite(buffer,size,count,f

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

24、read()和fwrite()用于二進制文件的輸入輸出。,#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 文件的隨機讀寫,解決的辦法:把文件指針移到指定的位置即可。,關鍵步驟:文件的定位。,3.5 文件的隨機讀寫,問題:要求打開文件后,對指定位置上的數(shù)據進行讀寫操作,減少一些不必要的中間環(huán)節(jié)。,一、對文件隨機存取的思想,? 對一個文件流,有主觀的愿望要取指定位置的記錄和更新指定位置的記錄。,如:對一個文件流,可以有兩種目的:,? 從第i個字節(jié)開始,讀取k個字節(jié)的內容,? 把k個字節(jié)的內容寫到從第i個字節(jié)開始后,存在的問題:讀取的內容是

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

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

32、0l, 2);,將位置從當前位置向后移10個字節(jié),六、位置函數(shù),ftell(文件指針變量);,作用:返回位置指針的當前指向,返回值:,,≥0, 文件指針的當前指向,?1, 出錯,例5: 文件data1.txt的內容如下:,This is a test.,C語言程序設計,隨機讀寫函數(shù)測試。,要求編寫一程序隨機讀出指定的記錄。,七、重新定位函數(shù),rewind( 文件指針變量 ),作用:使文件指針返回到文件的開頭,無返回值,#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);}},運行結果:,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);},,?,思考:,若要采用隨機讀寫的方式讀取一個漢字,程序如何修改?,提示: 一個漢字占2個字節(jié),可使用fgets ( )函數(shù)將要讀出的漢字裝a數(shù)組,讀取的字符個數(shù)必須為≥3的單數(shù),八、文件操作的錯誤檢測,C語言對于大多數(shù)標準I/O函數(shù)不具有明確的出錯信息。,調用形式:ferror(fp),,文件指針,返回值:,,0: 未出錯,非0:出錯,ferror函數(shù)的值是最后一次調用時的出錯狀

36、態(tài)。,練 習,程序設計題:統(tǒng)計滿足條件x*x+y*y+z*z==2000的所有解的個數(shù),并將統(tǒng)計結果以格式"%d"寫入到新建的文件design.dat。 說明:若a、b、c是1個解,則a、c、b也是1個解,等等。 #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);,練 習,程序設計題:在正整數(shù)中找出1個最小的、被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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論