《C語言課件第十三章》由會(huì)員分享,可在線閱讀,更多相關(guān)《C語言課件第十三章(43頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級(jí),第三級(jí),第四級(jí),第五級(jí),2014/5/30,#,第十三章,文件,第十三章文件,1,本章要點(diǎn),文件的基本概念,文件的基本函數(shù),文件的順序讀寫,文件的隨機(jī)讀寫,文件簡(jiǎn)單應(yīng)用,本章要點(diǎn) 文件的基本概念,2,主要內(nèi)容,13.1,文件概述,13.2,文件類型指針,13.3,文件的打開與關(guān)閉,13.4,文件的讀寫,13.5,文件的定位,13.6,出錯(cuò)的檢測(cè),13.7,文件輸入輸出小結(jié),主要內(nèi)容13.1 文件概述,3,13.1 C,文件概述,文件:,文件指存儲(chǔ)在外部介質(zhì),(,如磁盤磁帶,),上,數(shù)據(jù)的集合。,操作系統(tǒng)是以文件為單位對(duì)數(shù)據(jù)進(jìn)行管理的。
2、,文件,程序,數(shù)據(jù)區(qū),輸,出,文件緩沖區(qū),輸,入,文件緩沖區(qū),13.1 C文件概述文件:文件指存儲(chǔ)在外部介質(zhì)(如磁盤磁帶),4,13.1 C,文件概述,(,續(xù),),文件的分類,從用戶觀點(diǎn),:,特殊文件,(,標(biāo)準(zhǔn)輸入輸出文件或標(biāo)準(zhǔn)設(shè)備文件,),。,普通文件,(,磁盤文件,),。,從操作系統(tǒng)的角度看,每一個(gè)與主機(jī)相連的輸入,輸出設(shè)備看作是一個(gè)文件。,例,:輸入文件:終端鍵盤,輸出文件:顯示屏和打印機(jī),13.1 C文件概述(續(xù))文件的分類,5,文件的分類,按數(shù)據(jù)的組織形式,:,ASCII,文件,(,文本文件,):,每一個(gè)字節(jié)放一個(gè),ASCII,代碼,二進(jìn)制文件,:,把內(nèi)存中的數(shù)據(jù)按其在內(nèi)存中的存儲(chǔ)形
3、,式原樣輸出到磁盤上存放。,例:,整數(shù),10000,在內(nèi)存中的存儲(chǔ)形式以及分別按,ASCII,碼形式和二進(jìn)制形式輸出如下圖所示:,13.1 C,文件概述,(,續(xù),),文件的分類13.1 C文件概述(續(xù)),6,13.1 C,文件概述,(,續(xù),),文件的分類,ASCII,文件和二進(jìn)制文件的比較:,ASCII,文件,便于對(duì)字符進(jìn)行逐個(gè)處理,也便于輸出,字符。但一般占存儲(chǔ)空間較多,而且要花費(fèi)轉(zhuǎn)換時(shí),間。,二進(jìn)制文件,可以節(jié)省外存空間和轉(zhuǎn)換時(shí)間,但一個(gè),字節(jié)并不對(duì)應(yīng)一個(gè)字符,不能直接輸出字符形式。,一般中間結(jié)果數(shù)據(jù)需要暫時(shí)保存在外存上,以后又,需要輸入內(nèi)存的,常用二進(jìn)制文件保存。,13.1 C文件概述(
4、續(xù))文件的分類,7,13.1 C,文件概述,(,續(xù),),文件的分類,C,語言對(duì)文件的處理方法:,緩沖文件系統(tǒng):,系統(tǒng)自動(dòng)地在內(nèi)存區(qū)為每一個(gè)正,在使用的文件開辟一個(gè)緩沖區(qū)。用緩沖文件系統(tǒng),進(jìn)行的輸入輸出又稱為,高級(jí)磁盤輸入輸出,。,非緩沖文件系統(tǒng):,系統(tǒng)不自動(dòng)開辟確定大小的緩,沖區(qū),而由程序?yàn)槊總€(gè)文件設(shè)定緩沖區(qū)。用非緩,沖文件系統(tǒng)進(jìn)行的輸入輸出又稱為,低級(jí)輸入輸出,系統(tǒng)。,13.1 C文件概述(續(xù))文件的分類,8,13.1 C,文件概述,(,續(xù),),說明,:,在,UNIX,系統(tǒng)下,用緩沖文件系統(tǒng)來處理文本文件,用非緩沖文件系統(tǒng)來處理二進(jìn)制文件。,ANSI C,標(biāo)準(zhǔn)只采用緩沖文件系統(tǒng)來處理文本文,
5、件和二進(jìn)制文件。,C,語言中對(duì)文件的讀寫都是用庫(kù)函數(shù)來實(shí)現(xiàn)。,13.1 C文件概述(續(xù))說明:,9,13.2,文件類型指針,Turbo,在,stdio.h,文件中有以下的文件類型聲明:,typedef struct,shortlevel;,*緩沖區(qū),“,滿,”,或,“,空,”,的程度*,unsignedflags;,*文件狀態(tài)標(biāo)志*,charfd;,*文件描述符*,unsignedcharhold;,*如無緩沖區(qū)不讀取字符*,shortbsize;,*緩沖區(qū)的大小*,unsignedchar*buffer,;/*,數(shù)據(jù)緩沖區(qū)的位置*,/,unsignedar*curp;,/*,指針,當(dāng)前的指向
6、*,/,unsignedistemp;,/*,臨時(shí)文件,指示器*,/,shorttoken;,/*,用于有效性檢查*,/,FILE,;,在緩沖文件系統(tǒng)中,每個(gè)被使用的文件都要在內(nèi)存中開辟一,FILE,類型的區(qū),存放文件的有關(guān)信息。,13.2 文件類型指針Turbo 在stdio.h文件中有,10,13.2,文件類型指針,(,續(xù),),FILE,類型的數(shù)組:,FILE,f,5,;,定義了一個(gè)結(jié)構(gòu)體數(shù)組,f,,它有,5,個(gè)元素,,可以用來存放,5,個(gè)文件的信息。,文件型指針變量,:,FILE *fp,;,fp,是一個(gè)指向,FILE,類型結(jié)構(gòu)體的,指針變量??梢允?fp,指向某一個(gè)文件的結(jié)構(gòu)體變量,從
7、,而通過該結(jié)構(gòu)體變量中的文件信息能夠訪問該文件。如果,有個(gè)文件,一般應(yīng)設(shè)個(gè)指針變量,使它們分別指向,個(gè)文件,以實(shí)現(xiàn)對(duì)文件的訪問。,13.2 文件類型指針(續(xù))FILE類型的數(shù)組:,11,13.3,文件的打開與關(guān)閉,一,.,文件的打開,(fopen,函數(shù),),函數(shù)調(diào)用,:,FILE *fp,;,fp,fopen,(,文件名,,,使用文件方式,);,需要打開的文件名,也就是準(zhǔn)備訪問的文件的名字;,使用文件的方式(,“,讀,”,還是,“,寫,”,等);,讓哪一個(gè)指針變量指向被打開的文件。,13.3 文件的打開與關(guān)閉一.文件的打開(fopen函數(shù)),12,13.3,文件的打開與關(guān)閉,(,續(xù),),文件使
8、用方式含 義,“,r,”,(,只讀,),為,輸入,打開一個(gè),文本,文件,“,w,”,(,只寫,),為,輸出,打開一個(gè),文本,文件,“,a,”,(,追加,),向,文本,文件尾增加數(shù)據(jù),“,rb,”,(,只讀,),為,輸入,打開一個(gè),二進(jìn)制,文件,“,wb,”,(,只寫,),為,輸出,打開一個(gè),二進(jìn)制,文件,ab,“,(,追加,),向,二進(jìn)制,文件尾增加數(shù)據(jù),r+,“,(,讀寫,),為,讀,/,寫,打開一個(gè),文本,文件,w+,”,(,讀寫,),為,讀,/,寫建立,一個(gè)新的,文本,文件,a+,”,(,讀寫,),為讀,/,寫打開一個(gè)文本文件,rb+,“,(,讀寫,),為讀,/,寫打開一個(gè),二進(jìn)制,文件
9、,“,wb+,“,(,讀寫,),為讀,/,寫,建立,一個(gè)新的,二進(jìn)制,文件,“,ab+,”,(,讀寫,),為讀,/,寫打開一個(gè),二進(jìn)制,文件,13.3 文件的打開與關(guān)閉(續(xù))文件使用方式含,13,13.3,文件的打開與關(guān)閉,(,續(xù),),二,.,文件的關(guān)閉,(fclose,函數(shù),),函數(shù)調(diào)用,:,fclose,(,文件指針,);,函數(shù)功能,:,使文件指針變量不指向該文件,也就是文件指針變,量與文件,“,脫鉤,”,,此后不能再通過該指針對(duì)原來與,其相聯(lián)系的文件進(jìn)行讀寫操作,。,返回值,:,關(guān)閉成功返回值為;否則返回,EOF(-1),。,13.3 文件的打開與關(guān)閉(續(xù))二.文件的關(guān)閉(fclose,
10、14,13.4,文件的讀寫,一、字符輸入輸出函數(shù),(fputs(),和,fgets(),fputs,函數(shù),函數(shù)調(diào)用,:,fputs(ch,,,fp),;,函數(shù)功能,:,將字符(,ch,的值)輸出到,fp,所指向的文件中去。,返回值,:,如果輸出成功,則返回值就是輸出的字符;,如果輸出失敗,則返回一個(gè),EOF,。,13.4 文件的讀寫一、字符輸入輸出函數(shù)(fputs()和f,15,13.4,文件的讀寫,(,續(xù),),fgets,函數(shù),函數(shù)調(diào)用,:,ch,fgets,(,fp,);,函數(shù)功能,:,從指定的文件讀入一個(gè)字符,該文件必須是以讀或,讀寫方式打開的。,返回值,:,讀取成功一個(gè)字符,賦給。,如
11、果遇到文件結(jié)束符,返回一個(gè)文件結(jié)束標(biāo)志,EOF,。,13.4 文件的讀寫(續(xù))fgets函數(shù),16,13.4,文件的讀寫,(,續(xù),),常見的讀取字符操作,從一個(gè),文本文件,順序讀入字符并在屏幕上顯示出來:,ch=fgetc,(,fp,);,while,(,ch,!,=EOF,),putchar,(,ch,);,ch=fgetc,(,fp,);,注意:,EOF,不是可輸出字符,因此不能在屏幕上顯示。,由于字符的,ASCII,碼不可能出現(xiàn),因此,EOF,定義為,是合適的。當(dāng)讀入的字符值等于時(shí),表示讀入,的已不是正常的字符而是文件結(jié)束符。,13.4 文件的讀寫(續(xù))常見的讀取字符操作,17,13.4
12、,文件的讀寫,(,續(xù),),常見的讀取字符操作,從一個(gè),二進(jìn)制文件,順序讀入字符:,while,(!,feof,(,fp,),ch=fgetc,(,fp,);,注意:,ANSI C,提供一個(gè),feof,()函數(shù)來判斷文件是否,真的結(jié)束。如果是文件結(jié)束,函數(shù),feof,(,fp,)的值為,(真);否則為(假)。以上也適用于文本文件的讀取。,13.4 文件的讀寫(續(xù))常見的讀取字符操作,18,13.4,文件的讀寫,(,續(xù),),fputc,和,fgetc,函數(shù)使用舉例:,例,3,從鍵盤輸入一些字符,逐個(gè)把它們送到,磁盤上去,直到輸入一個(gè),“,”,為止。,#include,#include,void m
13、ain(void),FILE*fp;,char ch,filename10;,scanf(%s,filename);,if(fp=fopen(filename,w)=NULL),printf(cannot open filen);,exit(0);,/*,終止程序*,/,ch=getchar();,/*,接收?qǐng)?zhí)行,scanf,語句時(shí)最后輸入的回車符*,/,ch=getchar();,/*,接收輸入的第一個(gè)字符*,/,while(ch!=#,fputc(ch,fp);putchar(ch);,ch=getchar();,fclose(fp);,運(yùn)行情況如下:,(輸入磁盤文件名),(輸入一個(gè)字符串
14、),(輸出一個(gè)字符串),13.4 文件的讀寫(續(xù))fputc和fgetc函數(shù)使用舉,19,13.4,文件的讀寫,(,續(xù),),fputc,和,fgetc,函數(shù)使用舉例:,例,3,將一個(gè)磁盤文件中的信息復(fù)制到另一個(gè)磁,盤文件中,。,#include,#include,main(),FILE*in,*out;,char ch,infile10,outfile10;,printf(Enter the infile name:n);,scanf(%s,infile);,printf(Enter the outfile name:n);,scanf(%s,outfile);,if(in=fopen(inf
15、ile,r)=NULL),printf(cannot open infilen);,exit(0);,if(out=fopen(outfile,w)=NULL),printf(cannot open outfilen);,exit(0);,while(!feof(in)fputc(fgetc(in),out);,fclose(in);,fclose(out);,運(yùn)行情況如下:,(輸入原有磁盤文件名,n,:,(輸入新復(fù)制的磁盤文件名),程序運(yùn)行結(jié)果是將文件中的內(nèi)容復(fù)制到,中去。,13.4 文件的讀寫(續(xù))fputc和fgetc函數(shù)使用舉,20,13.4,文件的讀寫,(,續(xù),),fputc,和,f
16、getc,函數(shù)使用舉例:,例,3,的改進(jìn):復(fù)制一個(gè)二進(jìn)制文件,利用,main,參數(shù),在輸入命令行是將兩個(gè)文件名輸入。,#include,#include,main(,int,argc,char*argv,),FILE*in,*out;,char ch;,if(argc!=3),printf(You forgot to enter a filenamen);,exit(0);,if(in=fopen(argv1,rb,)=NULL),printf(cannot open infilen);,exit(0);,if(out=fopen(argv2,wb,)=NULL),printf(cannot open outfilen);,exit(0);,while(!feof(in)fputc(fgetc(in),out);,fclose(in);,fclose(out);,運(yùn)行方法:,設(shè)經(jīng)編譯連接后得到的可執(zhí)行文件名為,a.exe,,則在,DOS,命令工,作方式下,可以輸入以下的命令行:,a,和,分別輸入到,和中,的內(nèi)容為,a,,的,值等于,。,13.4 文件的讀寫(續(xù))fputc和fgetc函