C語(yǔ)言程序設(shè)計(jì) 課件 (張惠濤 ) 西電 第8章 文件_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì) 課件 (張惠濤 ) 西電 第8章 文件_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì) 課件 (張惠濤 ) 西電 第8章 文件_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì) 課件 (張惠濤 ) 西電 第8章 文件_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì) 課件 (張惠濤 ) 西電 第8章 文件_第5頁(yè)
已閱讀5頁(yè),還剩16頁(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)介

第八章文件文件68.1文件基本概念及分類(lèi)8.2文件類(lèi)型指針8.3文件的打開(kāi)與關(guān)閉8.4文件的讀寫(xiě)8.5文件的定位8.6C語(yǔ)言學(xué)習(xí)之路8.7本章小結(jié)8.1文件基本概念及分類(lèi)文件在計(jì)算機(jī)領(lǐng)域是一個(gè)重要的概念,它其實(shí)是指存儲(chǔ)在計(jì)算機(jī)外存上的一組相關(guān)數(shù)據(jù)的有序集合。數(shù)據(jù)集合的名稱(chēng)就叫文件名,在系統(tǒng)當(dāng)中是唯一的,是其本身的操作標(biāo)志。前面的各章中涉及到的源程序文件、目標(biāo)文件、可執(zhí)行文件、庫(kù)文件等等都可以叫作文件。C語(yǔ)言提供了強(qiáng)大的機(jī)制支持文件的各類(lèi)操作。本章重點(diǎn)圍繞ASCII碼文件和二進(jìn)制碼文件進(jìn)行學(xué)習(xí)。ASCII文件也叫文本文件,它在磁盤(pán)中存放時(shí)每個(gè)字節(jié)存儲(chǔ)一個(gè)ASCII表示的字符。文本文件是可以直接閱讀的,可使用記事本打開(kāi),其擴(kuò)展名為.txt。二進(jìn)制文件是按內(nèi)存中的二進(jìn)制的存儲(chǔ)形式原樣輸出到磁盤(pán)上來(lái)保存,因此這類(lèi)文件一般不能使用記事本直接打開(kāi)來(lái)閱讀其中內(nèi)容。C系統(tǒng)在處理文件時(shí),就把文件看成是字節(jié)流或二進(jìn)制流,按字節(jié)進(jìn)行處理。本章將重點(diǎn)講解ANSIC規(guī)定文件系統(tǒng)及其標(biāo)準(zhǔn)輸入輸出函數(shù)。8.2文件類(lèi)型指針?biāo)^文件指針,實(shí)際上是指向結(jié)構(gòu)體類(lèi)型的指針變量,這個(gè)結(jié)構(gòu)體中包含文件的信息,如緩沖區(qū)的地址,在緩沖區(qū)中當(dāng)前存取的字符的位置,對(duì)文件是“讀”還是“寫(xiě)”,是否出錯(cuò),是否已經(jīng)遇到文件結(jié)束標(biāo)志等信息。此結(jié)構(gòu)體類(lèi)型名為FILE,可以由此類(lèi)型來(lái)定義文件指針。定義文件類(lèi)型指針變量的一般形式為: FILE*指針變量標(biāo)識(shí)符;例如: FILE*fp;fp被定義為指向文件類(lèi)型的指針變量,稱(chēng)為文件指針。文件指針用于指向多個(gè)文件,實(shí)際上是用于存放文件緩沖區(qū)的地址。在緩沖文件系統(tǒng)中可以進(jìn)行文件的打開(kāi)、關(guān)閉、讀、寫(xiě)、定位等操作。結(jié)構(gòu)類(lèi)型名“FILE”必須大寫(xiě)。一般情況下對(duì)文件操作有3個(gè)步驟:打開(kāi)文件,即在計(jì)算機(jī)內(nèi)存中開(kāi)辟緩沖區(qū),用于存放被打開(kāi)文件的相關(guān)信息;文件處理,包括讀寫(xiě)、定位等操作;關(guān)閉文件,將緩沖區(qū)中的內(nèi)容寫(xiě)回到磁盤(pán),然后釋放緩沖區(qū)。8.3文件的打開(kāi)與關(guān)閉8.3.1文件打開(kāi)函數(shù)fopen()fopen()函數(shù)用來(lái)打開(kāi)一個(gè)文件,其調(diào)用的一般形式為:

文件指針名=fopen(文件名,打開(kāi)文件方式)其中,“文件指針名”必須是被說(shuō)明為FILE類(lèi)型的指針變量;“文件名”是被打開(kāi)文件的文件名,

以字符串常量或字符串?dāng)?shù)組的形式出現(xiàn);“打開(kāi)文件方式”是指文件的類(lèi)型和操作要求。例如: FILE*fp; fp=("C:\\myfile.txt","wt");其意義是在C盤(pán)根目錄下只寫(xiě)打開(kāi)或建立一個(gè)文本文件myfile,只允許寫(xiě)數(shù)據(jù)操作,并使文件指針fp指向該文件。文件名字符串中兩個(gè)反斜線“\\”中的第一個(gè)表示轉(zhuǎn)義字符,第二個(gè)表示根目錄。8.3文件的打開(kāi)與關(guān)閉8.3.1文件打開(kāi)函數(shù)fopen()打開(kāi)文件的方式有12種,如下表所示打開(kāi)方式文件類(lèi)型含義“r”文本文件只讀打開(kāi)一個(gè)文本文件,只允許讀數(shù)據(jù)“w”文本文件只寫(xiě)打開(kāi)或建立一個(gè)文本文件,只允許寫(xiě)數(shù)據(jù)“a”文本文件追加打開(kāi)一個(gè)文本文件,并在文件末尾寫(xiě)數(shù)據(jù)“r+”文本文件讀寫(xiě)打開(kāi)一個(gè)文本文件,允許讀和寫(xiě)“w+”文本文件讀寫(xiě)打開(kāi)或建立一個(gè)文本文件,允許讀寫(xiě)“a+”文本文件讀寫(xiě)打開(kāi)一個(gè)文本文件,允許讀,或在文件末追加數(shù)據(jù)“rb”二進(jìn)制文件只讀打開(kāi)一個(gè)二進(jìn)制文件,只允許讀數(shù)據(jù)“wb”二進(jìn)制文件只寫(xiě)打開(kāi)或建立一個(gè)二進(jìn)制文件,只允許寫(xiě)數(shù)據(jù)“ab”二進(jìn)制文件追加打開(kāi)一個(gè)二進(jìn)制文件,并在文件末尾寫(xiě)數(shù)據(jù)“rb+”二進(jìn)制文件讀寫(xiě)打開(kāi)一個(gè)二進(jìn)制文件,允許讀和寫(xiě)“wb+”二進(jìn)制文件讀寫(xiě)打開(kāi)或建立一個(gè)二進(jìn)制文件,允許讀和寫(xiě)“ab+”二進(jìn)制文件讀寫(xiě)打開(kāi)一個(gè)二進(jìn)制文件,允許讀,或在文件末追加數(shù)據(jù)8.3文件的打開(kāi)與關(guān)閉8.3.2文件關(guān)閉函數(shù)fclose()文件一旦使用完畢,要用關(guān)閉文件函數(shù)fclose()把文件關(guān)閉,以避免文件的數(shù)據(jù)丟失等情況發(fā)生。fclose()函數(shù)調(diào)用的一般形式是: fclose(文件指針);例如: fclose(fp);正常完成關(guān)閉文件操作時(shí),fclose()函數(shù)返回值為0;返回非零值表示有錯(cuò)誤發(fā)生。8.3文件的打開(kāi)與關(guān)閉例8.1演示打開(kāi)和關(guān)閉文本文件#include"stdio.h"#include"stdlib.h"intmain(){FILE*fp;if((fp=fopen("c:\\myfile.txt","wt"))==NULL){printf("打開(kāi)文件失敗\n");exit(0);}printf("打開(kāi)文件成功!");//此處可替換為對(duì)文件的讀寫(xiě)操作語(yǔ)句

if(fclose(fp)==0)printf("\n成功關(guān)閉文件!\n");elseprintf("\n未成功關(guān)閉文件!\n");system("pause");return0;}本程序演示了文件打開(kāi)和關(guān)閉的過(guò)程。如果文件未成功打開(kāi),則打印“不能打開(kāi)文件”,否則打印“文件被成功打開(kāi)!”;如果文件成功關(guān)閉,則打印“成功關(guān)閉文件!”。正常情況下,該程序會(huì)在C盤(pán)根目錄下以讀寫(xiě)的方式建立myfile.txt文件,然后再把它關(guān)閉。8.4文件的讀寫(xiě)8.4.1字符讀寫(xiě)函數(shù):fgetc()和fputc()1、fputc()功能是將多個(gè)字符寫(xiě)到文件中,一般形式為:fputc(字符數(shù)據(jù),文件指針);例如:charc=‘a(chǎn)’;fput(c,fp);//其中fp是已經(jīng)正確打開(kāi)的可寫(xiě)文件的指針該語(yǔ)句將變量c的值寫(xiě)入fp所指向的文件中。2、fgetc()功能是從文件中讀取多個(gè)字符,一般形式為:fgetc(文件指針);例如:charch;ch=fgetc(fp);表示從文件fp中讀取多個(gè)字符,賦給變量ch,而fp的位置指針向前移動(dòng)到下一個(gè)字符。8.4文件的讀寫(xiě)8.4.1字符讀寫(xiě)函數(shù):fgetc()和fputc()例8.2演示向打開(kāi)的文本文件中寫(xiě)入或讀取一個(gè)字符#include"stdio.h"#include"stdlib.h"intmain(){FILE*fp;charch='a';charch1='b';//ch1初始值設(shè)置為’b’if((fp=fopen("c:\\myfile.txt","w+"))==NULL){printf("打開(kāi)文件失??!\n");exit(0);}

printf("打開(kāi)文件成功!\n");fputc(ch,fp);rewind(fp);//將文件指針重新指向文件開(kāi)頭

printf("ch1初始值為:%c\n",ch1);ch1=fgetc(fp);printf("ch1現(xiàn)在的值為:%c\n",ch1);

if(fclose(fp)==0)printf("關(guān)閉文件成功!\n");elseprintf("關(guān)閉文件失??!\n");system("pause");return0;}8.4文件的讀寫(xiě)8.4.2字符串讀寫(xiě)函數(shù):fgets()和fputs()1、fputs()功能是向指定文件輸出字符串,一般形式為:fputs(字符串,文件指針);2、fgets()功能是從文件中讀字符串,一般形式為:fgets(字符串起始地址,字符數(shù)量,文件指針);例8.3演示向打開(kāi)的文本文件中寫(xiě)入或讀取字符串#include"stdio.h"#include"stdlib.h"intmain(){FILE*fp;charch[]=”helloworld”;charch1[30]=”abcdefg”;if((fp=fopen("c:\\myfile.txt","w+"))==NULL){printf("打開(kāi)文件失?。n");exit(0);

}printf("打開(kāi)文件成功!\n");fputs(ch,fp);rewind(fp);//將文件指針重新指向文件開(kāi)頭printf("ch1初始值為:%s\n",ch1);fgets(ch1,4,fp);//從文件中取4-1=3個(gè)字符,留一個(gè)字節(jié)存放’\0’printf("ch1現(xiàn)在的值為:%s\n",ch1);

if(fclose(fp)==0)printf("關(guān)閉文件成功!\n");elseprintf("關(guān)閉文件失??!\n");system("pause");return0;}8.4文件的讀寫(xiě)8.4.3數(shù)據(jù)塊讀寫(xiě)函數(shù):freed()和fwrite()1、fread()函數(shù)的功能是從文件中讀取數(shù)據(jù)塊,一般形式為: fread(buffer,size,count,fp);關(guān)于fread()的幾點(diǎn)說(shuō)明:(1)fp是文件指針;buffer是一個(gè)指針,用來(lái)存放輸出數(shù)據(jù)塊的地址;size表示數(shù)據(jù)塊的字節(jié)數(shù);count表示要讀取的數(shù)據(jù)塊塊數(shù);(2)fread()函數(shù)的功能是從fp所指向文件的當(dāng)前位置開(kāi)始,一次讀取size個(gè)字節(jié),重復(fù)count次,并將讀取的數(shù)據(jù)存放到從buffer開(kāi)始的內(nèi)存中;同時(shí),將位置指針向前移動(dòng)size*count個(gè)字節(jié);(3)如果調(diào)用fread()函數(shù)成功,則函數(shù)返回值等于count。2、fwrite函數(shù)的功能是向文件寫(xiě)數(shù)據(jù)塊,其調(diào)用的一般形式為: fwrite(buffer,size,count,fp);關(guān)于fwrite()的幾點(diǎn)說(shuō)明:(1)fp是文件指針;buffer是一個(gè)指針,用來(lái)存放將要讀取數(shù)據(jù)塊的地址;size表示一個(gè)數(shù)據(jù)塊的字節(jié)數(shù);count表示要寫(xiě)的數(shù)據(jù)塊個(gè)數(shù);(2)fwrite()函數(shù)功能是從buffer指定的地址開(kāi)始,一次輸出size個(gè)字節(jié),重復(fù)count次,并將輸出的數(shù)據(jù)存放到fp所指向的文件中;同時(shí),將位置指針向前移動(dòng)size*count個(gè)字節(jié)。(3)如果調(diào)用fwrite函數(shù)成功,則函數(shù)返回值等于count。8.4文件的讀寫(xiě)8.4.3數(shù)據(jù)塊讀寫(xiě)函數(shù):freed()和fwrite()例8.4演示向打開(kāi)的文本文件中寫(xiě)入或讀取若干數(shù)據(jù)塊#include"stdio.h"#include"stdlib.h"intmain(){FILE*fp;charch[]="Helloeveryone,howareyou?";charch1[30]="1234567890";if((fp=fopen("c:\\myfile.txt","w+"))==NULL){printf("打開(kāi)文件失?。n");exit(0);}

printf("打開(kāi)文件成功!\n");fwrite(ch,5,3,fp);//從ch字符串中取3*5=15個(gè)字符的

//數(shù)據(jù)存入fp中rewind(fp);//將文件指針重新指向文件開(kāi)頭printf("ch1初始值為:%s\n",ch1);

fread(ch1,4,2,fp);//從fp中取2*4=8個(gè)字符的

//數(shù)據(jù)存入ch1字符數(shù)組中printf("ch1現(xiàn)在的值為:%s\n",ch1);

if(fclose(fp)==0)printf("關(guān)閉文件成功!\n");elseprintf("關(guān)閉文件失??!\n");system("pause");return0;}8.4文件的讀寫(xiě)8.4.4格式化讀寫(xiě)函數(shù):fscanf()和fprinf()1、fprintf()函數(shù)只能向文本文件中輸出數(shù)據(jù)。fprintf()函數(shù)和printf()函數(shù)相似,只是輸出的內(nèi)容將按指定格式存放到磁盤(pán)的文本文件中,而不是屏幕上。fprintf()函數(shù)的調(diào)用形式如下: fprintf(文件指針,格式控制字符串,輸出項(xiàng)表);//參考printf()函數(shù) fprintf(fp,"%d%d",x,y);//fp為以寫(xiě)入的方式正確打開(kāi)的文件指針2、fscanf()函數(shù)只能從文本文件中按格式輸出。fscanf()函數(shù)和scanf()函數(shù)相似,其輸出的對(duì)象是磁盤(pán)上文本文件中的數(shù)據(jù),而不是鍵盤(pán)的輸入數(shù)據(jù)。fscanf()函數(shù)的調(diào)用形式如下: fscanf(文件指針,格式控制字符串,輸出項(xiàng)表);//參考scanf()函數(shù) fscanf(fp,"%d%d",&a,&b);

8.4文件的讀寫(xiě)8.4.4格式化讀寫(xiě)函數(shù):fscanf()和fprinf()例8.5演示按指定格式向打開(kāi)的文本文件中寫(xiě)入或讀取一個(gè)字符#include"stdio.h"#include"stdlib.h"intmain(){FILE*fp;charch=’x’;charch1=’a’;if((fp=fopen("c:\\myfile.txt","w+"))==NULL){printf("打開(kāi)文件失??!\n");exit(0);}printf("打開(kāi)文件成功!\n");fprintf(fp,”%c”,ch);//向打開(kāi)的文件中輸出ch中的值’x’rewind(fp);//將文件指針重新指向文件開(kāi)頭printf("ch1初始值為:%c\n",ch1);fscanf(fp,”%c”,&ch1);//從打開(kāi)的文件中輸入一個(gè)字符,保存到ch1中

//與scanf()用法一樣,參數(shù)要使用&表示地址printf("ch1現(xiàn)在的值為:%c\n",ch1);if(fclose(fp)==0)printf("關(guān)閉文件成功!\n");elseprintf("關(guān)閉文件失??!\n");system("pause");return0;}8.5文件的定位8.5.1rewind()函數(shù)rewind函數(shù)的調(diào)用形式為: rewind(fp);該函數(shù)的作用是將文件指針?lè)祷匚募_(kāi)頭位置8.5文件的定位8.5.2fseek()函數(shù)函數(shù)fseek()是文件定位函數(shù),其一般調(diào)用形式為: fseek(文件類(lèi)型指針,位置字節(jié)數(shù),起始位置)起始位置有0,1,2三個(gè)參數(shù)可以選擇:0代表文件開(kāi)始位置;1代表當(dāng)前位置;2代表文件末尾。注意:該函數(shù)多用于二進(jìn)制文件,但也可以用于文本文件,不過(guò)要精確的控制位置量,不然由于文本文件要進(jìn)行字符轉(zhuǎn)換,會(huì)發(fā)生一定的錯(cuò)誤。8.5文件的定位例8.6演示fseek()函數(shù)進(jìn)行文件定位#include"stdio.h"#include"stdlib.h"intmain(){FILE*fp; inti;charch;if((fp=fopen("c:\\myfile.txt","w+"))==NULL){printf("打開(kāi)文件失敗\n");exit(0);}printf("打開(kāi)文件成功\n"); //以下for循環(huán)用于向打開(kāi)的文件中輸入26個(gè)小寫(xiě)字母 for(i=0;i<26;i++) { ch=i+97; fputc(ch,fp); } fseek(fp,1,0);//以文件開(kāi)頭為起點(diǎn),將fp向后移動(dòng)一個(gè)字節(jié)位置

ch=fgetc(fp);//獲得該位置的一個(gè)字符并賦值給ch printf("%c\n",ch); //打印ch存儲(chǔ)的字符if(fclose(fp)==0)printf("關(guān)閉文件成功!\n");elseprintf("關(guān)閉文件失?。n");

溫馨提示

  • 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ù)網(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)論