高級(jí)語言程序設(shè)計(jì)_第10章_文件_第1頁
高級(jí)語言程序設(shè)計(jì)_第10章_文件_第2頁
高級(jí)語言程序設(shè)計(jì)_第10章_文件_第3頁
高級(jí)語言程序設(shè)計(jì)_第10章_文件_第4頁
高級(jí)語言程序設(shè)計(jì)_第10章_文件_第5頁
已閱讀5頁,還剩35頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第十章第十章本章要點(diǎn)文件簡單應(yīng)用文件簡單應(yīng)用10.1 C文件基本知識(shí)文件基本知識(shí)文件的定義所謂文件一般指存儲(chǔ)在外部介質(zhì)(如磁盤)上數(shù)據(jù)的集合.操作系統(tǒng)是以文件為單位對(duì)數(shù)據(jù)進(jìn)行管理的.文件文件程序程序數(shù)據(jù)數(shù)據(jù)區(qū)區(qū)輸輸出出文件緩沖區(qū)文件緩沖區(qū)輸輸入入文件緩沖區(qū)文件緩沖區(qū)文件的分類從用戶觀點(diǎn):特殊文件(標(biāo)準(zhǔn)輸入輸出文件或標(biāo)準(zhǔn)設(shè)備文件)普通文件(磁盤文件)從操作系統(tǒng)的角度看,每一個(gè)與主機(jī)相連的輸入輸出設(shè)備看作是一個(gè)文件。例:輸入文件:終端鍵盤 輸出文件:顯示屏和打印機(jī)文件的分類按數(shù)據(jù)的組織形式:ASCII文件(文本文件):每一個(gè)字節(jié)放一個(gè)ASCII代碼二進(jìn)制文件:把內(nèi)存中的數(shù)據(jù)按其在內(nèi)存中的存儲(chǔ)形式原

2、樣輸出到磁盤上存放.例:整數(shù)10000在內(nèi)存中的存儲(chǔ)形式以及分別按ASCII碼形式和二進(jìn)制形式輸出如下圖所示: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)制文件保存。在UNIX系統(tǒng)下,用緩沖文件系統(tǒng)來處理文本文件,用非緩沖文件系統(tǒng)來處理二進(jìn)制文件.ANSI C 標(biāo)準(zhǔn)只采用緩沖文件系統(tǒng)來處理文本文件和二進(jìn)制文件.C語言中對(duì)文件的讀寫都是用庫函數(shù)來實(shí)現(xiàn).說明:

3、文件類型指針文件類型指針Turbo 在stdio.h文件中有以下的文件類型聲明:typedef struct short level; * *緩沖區(qū)緩沖區(qū)“滿滿”或或“空空”的程度的程度* * unsigned flags; * *文件狀態(tài)標(biāo)志文件狀態(tài)標(biāo)志* * char fd; * *文件描述符文件描述符* * unsigned char hold; * *如無緩沖區(qū)不讀取字符如無緩沖區(qū)不讀取字符* * short bsize; * *緩沖區(qū)的大小緩沖區(qū)的大小* * unsigned char *buffer;/;/* *數(shù)據(jù)緩沖區(qū)的位置數(shù)據(jù)緩沖區(qū)的位置* */ / unsigned cha

4、r *curp;/ /* *指針,當(dāng)前的指向指針,當(dāng)前的指向* */ / unsigned istemp;/ /* *臨時(shí)文件,指示器臨時(shí)文件,指示器* */ / short token;/ /* *用于有效性檢查用于有效性檢查* */ /FILE; 在緩沖文件系統(tǒng)中,每個(gè)被使用的文件都要在內(nèi)存中開辟一FILE類型的區(qū),存放文件的有關(guān)信息.文件類型指針文件類型指針(續(xù)續(xù))FILE類型的數(shù)組:FILEFILEf f5 5; ;定義了一個(gè)結(jié)構(gòu)體數(shù)組f,它有5個(gè)元素,可以用來存放5個(gè)文件的信息。文件型指針變量:FILE FILE * *fpfp;fp是一個(gè)指向FILE類型結(jié)構(gòu)體的指針變量??梢允筬p

5、指向某一個(gè)文件的結(jié)構(gòu)體變量,從而通過該結(jié)構(gòu)體變量中的文件信息能夠訪問該文件。如果有個(gè)文件,一般應(yīng)設(shè)個(gè)指針變量,使它們分別指向個(gè)文件,以實(shí)現(xiàn)對(duì)文件的訪問。10.2 文件的打開與關(guān)閉文件的打開與關(guān)閉10.2.1.文件的打開(fopen函數(shù))函數(shù)調(diào)用:FILE *fp;fpfopen(文件名,使用文件方式);例:fopen(“390922.txt”,”r”);需要打開的文件名,也就是準(zhǔn)備訪問的文件的名字;使用文件的方式(“讀”還是“寫”等);讓哪一個(gè)指針變量指向被打開的文件。 “r” (“r” (只讀只讀) )為為輸入輸入打開一個(gè)打開一個(gè)文本文本文件文件“w” (w” (只寫只寫) )為為輸出輸出打

6、開一個(gè)打開一個(gè)文本文本文件(建立)文件(建立)“a” (a” (追加追加) )向向文本文本文件尾增加數(shù)據(jù)文件尾增加數(shù)據(jù)“rb” (rb” (只讀只讀) )為為輸入輸入打開一個(gè)打開一個(gè)二進(jìn)制二進(jìn)制文件文件“wb” (wb” (只寫只寫) )為為輸出輸出打開一個(gè)打開一個(gè)二進(jìn)制二進(jìn)制文件文件(建立)(建立)ab“ (ab“ (追加追加) )向向二進(jìn)制二進(jìn)制文件尾增加數(shù)據(jù)文件尾增加數(shù)據(jù)r+“ (r+“ (讀寫讀寫) )為為讀讀/ /寫寫打開一個(gè)打開一個(gè)文本文本文件文件w+” (w+” (讀寫讀寫) )為為讀讀/ /寫建立寫建立一個(gè)新的一個(gè)新的文本文本文件文件(建立)(建立)a+” (a+” (讀寫讀寫

7、) )為讀為讀/ /寫打開一個(gè)文本文件寫打開一個(gè)文本文件rb+“ (rb+“ (讀寫讀寫) )為讀為讀/ /寫打開一個(gè)寫打開一個(gè)二進(jìn)制二進(jìn)制文件文件“wb+“ (wb+“ (讀寫讀寫) )為讀為讀/ /寫寫建立建立一個(gè)新一個(gè)新二進(jìn)制二進(jìn)制文件文件(建立)(建立)“ab+” (ab+” (讀寫讀寫) )為讀為讀/ /寫打開一個(gè)寫打開一個(gè)二進(jìn)制二進(jìn)制文件文件文件使用方式含文件使用方式含 義義函數(shù)調(diào)用:fclose(文件指針);例:fclose(fp);函數(shù)功能: 使文件指針變量不指向該文件,也就是文件指針變量與文件“脫鉤”,此后不能再通過該指針對(duì)原來與其相聯(lián)系的文件進(jìn)行讀寫操作返回值:關(guān)閉成功返回

8、值為;否則返回EOF(-1) 10.2.2.文件的關(guān)閉(fclose函數(shù))10.3 順序讀寫數(shù)據(jù)文件順序讀寫數(shù)據(jù)文件10.3.1.字符輸入輸出函數(shù)(fputc()和fgetc()fputc函數(shù)函數(shù)調(diào)用:fputc ( ch,fp ) ; 函數(shù)功能: 將字符(ch的值)輸出到fp所指向的文件中去。 返回值:如果輸出成功,則返回值就是輸出的字符;如果輸出失敗,則返回一個(gè)EOF.fgetc函數(shù)函數(shù)調(diào)用:chfgetc(fp);函數(shù)功能: 從指定的文件讀入一個(gè)字符,該文件必須是以讀或讀寫方式打開的。 返回值:讀取成功一個(gè)字符,賦給。如果遇到文件結(jié)束符,返回一個(gè)文件結(jié)束標(biāo)志EOF 。字符輸出函數(shù)fget

9、c()從一個(gè)文本文件順序讀入字符并在屏幕上顯示出來: ch = fgetc(fp); while(ch!=EOF) putchar(ch); ch = fgetc(fp); 注意:EOF不是可輸出字符,因此不能在屏幕上顯示。由于字符的ASCII碼不可能出現(xiàn),因此EOF定義為是合適的。當(dāng)讀入的字符值等于時(shí),表示讀入的已不是正常的字符而是文件結(jié)束符。 常見的讀取字符操作常見的讀取字符操作從一個(gè)二進(jìn)制文件順序讀入字符: while(!feof(fp) ch = fgetc(fp); 注意:ANSI C提供一個(gè)feof()函數(shù)來判斷文件是否真的結(jié)束。如果是文件結(jié)束,函數(shù)feof(fp)的值為(真);否

10、則為(假)。以上也適用于文本文件的讀取。 例例0.從鍵盤輸入一些字符,逐個(gè)把它從鍵盤輸入一些字符,逐個(gè)把它們送到磁盤上去,直到輸入一個(gè)們送到磁盤上去,直到輸入一個(gè)“”為為止止#include #include void main(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( );

11、 /* 接收輸入的第一個(gè)字符 */ while(ch!=#) fputc(ch,fp); putchar(ch); ch=getchar(); putchar(10); fclose(fp); 例例3將一個(gè)磁盤文件中的信息復(fù)制到將一個(gè)磁盤文件中的信息復(fù)制到另一個(gè)磁盤文件中另一個(gè)磁盤文件中 。 #include #include void main( )FILE *in,*out; char ch,infile10,outfile10; printf(Enter the infile name:n); scanf(%s,infile); printf(Enter the outfile name

12、:n); scanf(%s,outfile); if(in=fopen(infile,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);10.3.2 怎樣向文件讀寫一個(gè)字符串fgets函數(shù)函數(shù)作用:從指定文件讀入一個(gè)字符串。函數(shù)調(diào)用:fgets(str,n,fp);從fp指向的文件輸入n-1個(gè)字

13、符,在最后加一個(gè)0返回值:str的首地址fputs函數(shù)函數(shù)作用:向指定的文件輸出一個(gè)字符串。函數(shù)調(diào)用:fputs(“china”,fp);第一個(gè)參數(shù)可以是字符串常量、字符數(shù)組名或字符型指針。字符串末尾的不輸出。 返回值:輸入成功,返回值為0;輸入失敗,返回EOF. 例10.3. 從鍵盤讀入若干個(gè)字符串,對(duì)他們按字母大小的順序排序,然后把排好序的字符串送到磁盤文件中保存10.3.3 格式化讀寫函數(shù)(fprintf()和fscanf()函數(shù)調(diào)用:fprintf ( 文件指針,格式字符串,輸出表列);fscanf ( 文件指針,格式字符串,輸入表列); 函數(shù)功能: 從磁盤文件中讀入或輸出字符。 例:

14、fprintf(fp,”%d,%6.2f”,i,t);fscanf (fp,”%d,%f”,&i,&t);注意:用fprintf和fscanf函數(shù)對(duì)磁盤文件讀寫,使用方便,容易理解,但由于在輸入時(shí)要將ASCII碼轉(zhuǎn)換為二進(jìn)制形式,在輸出時(shí)又要將二進(jìn)制形式轉(zhuǎn)換成字符,花費(fèi)時(shí)間比較多。因此,在內(nèi)存與磁盤頻繁交換數(shù)據(jù)的情況下,最好不用fprintf和fscanf函數(shù),而用fread和fwrite函數(shù)。文件讀寫的簡單例子文件讀寫的簡單例子#include void main()int a,b,c,d;FILE *fp;scanf(%3d%3d,&a,&b);printf(n a=%d,b=%d n,a

15、,b);fp=fopen(file1.txt,w);fprintf(fp,%d,%d,a,b);fclose(fp);fp=fopen(file1.txt,r);fscanf(fp,%d,%d,&c,&d);fclose(fp);printf(n c=%d,d=%d n,c,d);10.3.4.用二進(jìn)制方式向文件讀寫一組數(shù)據(jù)函數(shù)調(diào)用:fread (buffer,size,count,fp);fwrite(buffer,size,count,fp); 參數(shù)說明:buffer:是一個(gè)指針。對(duì)fread 來說,它是讀入數(shù)據(jù)的存放地址。對(duì)fwrite來說,是要輸出數(shù)據(jù)的地址(均指起始地址)。size:

16、 要讀寫的字節(jié)數(shù)。count: 要進(jìn)行讀寫多少個(gè)size字節(jié)的數(shù)據(jù)項(xiàng)。fp: 文件型指針。例0.4 從鍵盤輸入個(gè)學(xué)生的有關(guān)數(shù)據(jù),然后把它們轉(zhuǎn)存到磁盤文件上去。 #include #define SIZE 4struct student_typechar name10; int num; int age; char addr15;studSIZE; /*定義結(jié)構(gòu)*/ void save( )FILE *fp; int i; if(fp=fopen(stu-list,wb)=NULL) printf(cannot open filen); return; for(i=0;iSIZE;i+)/*二進(jìn)

17、制寫*/ if(fwrite(&studi,sizeof(struct student_type),1,fp)!=1) printf(“file write errorn”);/*出錯(cuò)處理*/ fclose(fp); /*關(guān)閉文件*/ main()int i; for(i=0;iSIZE;i+)/*從鍵盤讀入學(xué)生信息*/ scanf(%s%d%d%s,,&studi.num, &.addr); save( ); /*調(diào)用save()保存學(xué)生信息* studi.age,studi / #include #define SIZE 4 struct student_typecha

18、r name10; int num; int age; char addr15;studSIZE; void main( )int i; FILE*fp;fp=fopen(stu_list,rb);for(i=0;iSIZE;i+) fread(&studi,sizeof(struct student_type),1,fp); printf(%-10s %4d %4d %-15sn,, studi.num,studi. age,studi.addr); fclose(fp);10.4 隨機(jī)讀寫數(shù)據(jù)文件順序讀寫:順序讀寫:位置指針按字節(jié)位置順序移動(dòng)。隨機(jī)讀寫隨機(jī)讀寫:讀寫完上

19、一個(gè)字符(字節(jié))后,并不一定要讀寫其后續(xù)的字符(字節(jié)),而可以讀些文件中任意位置上所需要的字符(字節(jié))。 10.4.1 文件位置的標(biāo)記及其定位文件位置的標(biāo)記及其定位(1) rewind函數(shù)函數(shù)作用:使位置指針重新返回文件的開頭,無返回值。應(yīng)用舉例應(yīng)用舉例:例例0.5 0.5 有一個(gè)磁盤文件,第一次將它的內(nèi)容顯示在屏幕上,第二次把它復(fù)制到另一文件上 #include main()FILE *fp1,*fp2; fp1=fopen(file1.c,r);fp2=fopen(file2.c,w); while(!feof(fp1) putchar(fgetc(fp1); rewind(fp1);wh

20、ile(!feof(fp1) fputc(fgetc(fp1),fp2); fclose(fp1); fclose(fp2); (2) fseek函數(shù)(一般用于二進(jìn)制文件)函數(shù)功能:函數(shù)功能:改變文件的位置指針函數(shù)調(diào)用形式函數(shù)調(diào)用形式:fseek(文件類型指針,位移量,起始點(diǎn))起始點(diǎn):文件開頭 SEEK_SET 0 文件當(dāng)前位置 SEEK_CUR 1 文件末尾 SEEK_END 2位移量:以起始點(diǎn)為基點(diǎn),向前移動(dòng)的字節(jié)數(shù)。 一般要求為long型 fseek函數(shù)應(yīng)用舉例fseek(fpfseek(fp,100L100L,);,);將位置指針移到離文件頭將位置指針移到離文件頭100100個(gè)字節(jié)處個(gè)

21、字節(jié)處fseek(fpfseek(fp,50L50L, ););將位置指針移到離當(dāng)前位置將位置指針移到離當(dāng)前位置5050個(gè)字節(jié)處個(gè)字節(jié)處fseek(fpfseek(fp,50L50L, ););將位置指針從文件末尾處向后退個(gè)字節(jié)將位置指針從文件末尾處向后退個(gè)字節(jié) 例例3在磁盤文件上存有個(gè)學(xué)生的數(shù)據(jù)。要求在磁盤文件上存有個(gè)學(xué)生的數(shù)據(jù)。要求將第、個(gè)學(xué)生數(shù)據(jù)輸入計(jì)算機(jī),并將第、個(gè)學(xué)生數(shù)據(jù)輸入計(jì)算機(jī),并在屏幕上顯示出來。在屏幕上顯示出來。#include #include #include#include struct student_type struct student_type char nam

22、e10; char name10; int num; int num; int age; int age; char sex; char sex; stud10; stud10; void void main()main() int i; FILE int i; FILE * *fp;fp; if(fp=fopen(stud-dat,rb)=NULL) if(fp=fopen(stud-dat,rb)=NULL) printf(can not open filen); exit(0); printf(can not open filen); exit(0); for(i=0;i10; for(

23、i=0;i10;i+=2i+=2) ) fseek(fp,ifseek(fp,i* *sizeof(struct student_type),0);sizeof(struct student_type),0); fread(&studi, sizeof(struct student_type),1,fp); fread(&studi, sizeof(struct student_type),1,fp); printf(“%s %d %d %cn”,, printf(“%s %d %d %cn”,, studi.num,studi.age,studi.se

24、x); studi.num,studi.age,studi.sex); fclose(fp); fclose(fp); ftell函數(shù)函數(shù)作用:得到流式文件中的當(dāng)前位置,用相對(duì)于文件開頭的位移量來表示。返回值:返回當(dāng)前位置,出錯(cuò)時(shí)返回-1L。應(yīng)用舉例:i = ftell(fp);if(i=-1L) printf(“errorn”); 10.5 文件讀寫的出錯(cuò)檢測文件讀寫的出錯(cuò)檢測ferror函數(shù)調(diào)用形式:ferror(fp);返回值:返回0,表示未出錯(cuò);返回非0,表示出錯(cuò)。在調(diào)用一個(gè)輸入輸出函數(shù)后立即檢查ferror函數(shù)的值,否則信息會(huì)丟失。在執(zhí)行fopen函數(shù)時(shí),ferror函數(shù)的初始值自動(dòng)置為。 clea

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論