第8章文件計(jì)算機(jī)科學(xué)技術(shù)學(xué)院_第1頁
第8章文件計(jì)算機(jī)科學(xué)技術(shù)學(xué)院_第2頁
第8章文件計(jì)算機(jī)科學(xué)技術(shù)學(xué)院_第3頁
第8章文件計(jì)算機(jī)科學(xué)技術(shù)學(xué)院_第4頁
第8章文件計(jì)算機(jī)科學(xué)技術(shù)學(xué)院_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第8章 文件長(zhǎng)春理工大學(xué)計(jì)算機(jī)科學(xué)技術(shù)學(xué)院主要內(nèi)容8.1 文件的有關(guān)概念8.2 流的創(chuàng)建與撤銷8.3 文件的順序讀寫8.4 文件的隨機(jī)讀寫8.5 文件操作的出錯(cuò)檢測(cè)8.1 文件的有關(guān)概念8.1.1 文件及其分類 文件:存儲(chǔ)在外部介質(zhì)上數(shù)據(jù)的集合,是操作系統(tǒng)數(shù)據(jù)管理的單位。 程序設(shè)計(jì)有關(guān)的文件分類:源程序文件、目標(biāo)程序文件、可執(zhí)行程序文件和數(shù)據(jù)文件等。 本章主要討論數(shù)據(jù)文件,即如何將程序處理的數(shù)據(jù)組織成文件保存到外部介質(zhì)上,以及怎樣從外部介質(zhì)上讀取這些數(shù)據(jù)。使用數(shù)據(jù)文件的目的1、數(shù)據(jù)文件的改動(dòng)不引起程序的改動(dòng)程序與數(shù)據(jù)分離2、不同程序可以訪問同一數(shù)據(jù)文件中的數(shù)據(jù)數(shù)據(jù)共享3、能長(zhǎng)期保存程序運(yùn)行的中

2、間數(shù)據(jù)或結(jié)果數(shù)據(jù)8.1 文件的有關(guān)概念文件分類按文件的邏輯結(jié)構(gòu):記錄文件:由具有一定結(jié)構(gòu)的記錄組成(定長(zhǎng)和不定長(zhǎng))流式文件:由一個(gè)個(gè)字符(字節(jié))數(shù)據(jù)順序組成(語言將文件看作是由一個(gè)一個(gè)字節(jié)組成的)。按存儲(chǔ)介質(zhì):普通文件:存儲(chǔ)介質(zhì)文件(磁盤、磁帶等)設(shè)備文件:非存儲(chǔ)介質(zhì)(鍵盤、顯示器、打印機(jī)等)按數(shù)據(jù)的組織形式:文本文件: ASCII文件,每個(gè)字節(jié)存放一個(gè)字符的ASCII碼二進(jìn)制文件:數(shù)據(jù)按其在內(nèi)存中的存儲(chǔ)形式原樣存放8.1 文件的有關(guān)概念如 short型數(shù)100000010011100010000內(nèi)存存儲(chǔ)形式0010011100010000二進(jìn)制形式00 0000001100000011000

3、0ASCII形式文本文件特點(diǎn):占用空間大、速度慢、便于對(duì)字符操作二進(jìn)制文件特點(diǎn):占用空間小、速度快、便于存放中間結(jié)果8.1 文件的有關(guān)概念8.1.2 文件名 一個(gè)文件必須有一個(gè)文件名。文件名包括三部分:文件路徑、文件名主干和文件名后綴。 文件路徑表明文件的存儲(chǔ)位置。如 f:exe3file1.txt 在C語言程序中,由于反斜杠符()是作為轉(zhuǎn)義字符的起始符號(hào),因此如果想用反斜杠符時(shí)要用兩個(gè)反斜杠符表示。即要寫成 f:exe3file1.txt8.1.3 文件的位置指針與讀寫方式 為了進(jìn)行讀寫,系統(tǒng)要為每個(gè)文件設(shè)置一個(gè)位置指針,用于指向當(dāng)前的讀寫位置。 當(dāng)要進(jìn)行讀或?qū)憰r(shí),文件的位置指針的初始值為文

4、件頭。 當(dāng)要為文件追加數(shù)據(jù)時(shí),文件的位置指針指向文件尾。 在ASCII文件中,通常,每進(jìn)行一次讀或?qū)?,位置指針就自?dòng)加1,指向下一個(gè)字符位置,為下一次讀或?qū)懽鳒?zhǔn)備,形成順序讀寫方式。8.2 流的創(chuàng)建與撤銷 8.2.1 FILE類型指針 FILE類型 FILE類型指針 標(biāo)準(zhǔn)文件8.2.1 FILE類型指針FILE結(jié)構(gòu)體類型 緩沖文件系統(tǒng)為每個(gè)正使用的文件在內(nèi)存開辟文件信息區(qū)文件信息用系統(tǒng)定義的名為FILE的結(jié)構(gòu)體描述FILE定義在stdio.h中typedef struct short level; /* 緩沖區(qū)“滿”或“空”的程度 */ unsigned flags; /* 文件狀態(tài)標(biāo)志*/

5、char fd; /* 文件描述符 */ unsigned char hold; /* 如無緩沖區(qū)不讀取字符 */ short bsize; /* 緩沖區(qū)大小*/ unsigned char *buffer; /* 緩沖區(qū)的位置 */ unsigned char *curp; /* 指針,當(dāng)前的指向 */ unsigned istemp; /* 臨時(shí)文件,指示器 */ short token; /* 用于有效性檢查 */ FILE; FILE類型指針指針變量說明: FILE *fp;用法:文件打開時(shí),系統(tǒng)自動(dòng)開辟文件結(jié)構(gòu)體變量,用來存放文件的相關(guān)信息,并把該變量的指針返回來,程序通過這個(gè)指針獲

6、得文件信息,訪問文件。文件關(guān)閉后,它的文件結(jié)構(gòu)體變量被釋放。8.2.1 FILE類型指針程序數(shù)據(jù)區(qū)輸入緩沖區(qū)輸出緩沖區(qū)外部介質(zhì)文件處理方法緩沖文件系統(tǒng):高級(jí)文件系統(tǒng),系統(tǒng)自動(dòng)為正在使用的文件開辟內(nèi)存緩沖區(qū)非緩沖文件系統(tǒng):低級(jí)文件系統(tǒng),由用戶在程序中為每個(gè)文件設(shè)定緩沖區(qū)緩沖文件系統(tǒng):8.2.2 流 建立了與文件相應(yīng)的流,與該文件相應(yīng)的文件結(jié)構(gòu)體變量(即文件的信息區(qū))才會(huì)有具體的值,F(xiàn)ILE類型的指針也就會(huì)指向相應(yīng)的文件的結(jié)構(gòu)體變量。文件1的信息區(qū)fp1文件2的信息區(qū)fp2文件3的信息區(qū)fp38.2.2 流C文件操作用庫函數(shù)實(shí)現(xiàn),包含在stdio.h文件使用方式:打開文件-文件讀/寫-關(guān)閉文件8.

7、2.3 文件的打開與關(guān)閉流的創(chuàng)建與撤銷8.2.3 文件的打開與關(guān)閉流的創(chuàng)建與撤銷1. 文件的打開 fopen (文件名,文件操作方式);功能:按指定方式打開文件返回值:正常打開,返回一個(gè)FILE類型的指針值;打開失敗,為NULL值。操作方式操作方式符號(hào)對(duì)文本文件對(duì)二進(jìn)制文件讀打開rrb寫生成wwb追加aab讀寫打開r+rb+/r+b讀寫生成w+wb+/w+b讀寫追加a+ab+/a+b8.2.3 文件的打開與關(guān)閉流的創(chuàng)建與撤銷文件操作方式例 文件打開與測(cè)試 FILE *fp; fp=fopen(“aa.c”,“w”); if(fp=NULL) printf(“File open error!n”

8、); exit(0); 例 FILE *fp; char *filename=“test.dat” fp= fopen(filename,”r”); 例 FILE *fp; fp= fopen (“test.dat”, “r”); 8.2.3 文件的打開與關(guān)閉流的創(chuàng)建與撤銷2. 文件的關(guān)閉 fclose(文件指針變量)功能:關(guān)閉fp指向的文件返值:正常關(guān)閉為0;出錯(cuò)時(shí),非0作用:使文件指針變量與文件“脫鉤”,釋放文件結(jié)構(gòu)體變量,指針變量也不再指向該文件。例如: FILE *fp; fp=fopen(data.c,r); fclose(fp);/*關(guān)閉fp所指向的文件*/8.2.3 文件的打開與

9、關(guān)閉流的創(chuàng)建與撤銷8.3 文件的順序讀寫8.3.1 文件的字符讀寫8.3.2 文件的字符串讀寫8.3.3 文件的格式化讀寫8.3.4 文件的記錄讀寫8.3.1 文件的字符讀寫 fputc調(diào)用方式: fputc( ch, fp)功能:把ch中一個(gè)字符寫入fp指向的文件中返值:正常,返回所寫字符;出錯(cuò),為EOF(-1)fgetc調(diào)用方式: fgetc(fp)功能:從fp指向的文件中讀取一個(gè)字符返值:正常,返回讀取的字符;讀到文件尾或出錯(cuò),為EOF8.3.1 文件的字符讀寫#include #include int main(void)FILE *fp;int ch;if (fp=fopen(“f:

10、C3exfile1.txt”,”w”)=NULL)printf(“cannot open this file.n”);exit(1);while (ch=getchar()!=n)fputc(ch,fp);fclose(fp); return 0;運(yùn)行情況如下,當(dāng)鍵入: I love China.時(shí),這些字符將逐個(gè)被輸出到磁盤文件file1.txt中。例8.18.3.1 文件的字符讀寫#include #include int main(void)FILE *fp;char ch;if ( fp=fopen(“f:C3exfile1.txt”,”r”)=NULL) printf(“cannot

11、 open this file.n”); exit(1); while ( ch=fgetc(fp)!=EOF) putchar(ch);fclose(fp);return 0;程序運(yùn)行顯示如下結(jié)果:I love China.例8.2while (!feof(fp) ch=fgetc(fp); putchar(ch);fgets(s, n,fp)fputs(s,fp)功能:從fp指向的文件讀/寫一個(gè)字符串返值:fgets正常時(shí)返回讀取字符串的首地址;出錯(cuò)或文件尾,返回NULLfputs正常時(shí)返回非負(fù)值;出錯(cuò)為EOFfgets從fp所指文件讀n-1個(gè)字符送入s指向的內(nèi)存區(qū),并在最后加一個(gè)0(若讀

12、入n-1個(gè)字符前遇換行符或文件尾(EOF)即結(jié)束)調(diào)用方式:fputs把s指向的字符串寫入fp指向的文件fputs(china,fp);fgets(str,n,fp);8.3.2 文件的字符串讀寫8.3.2 文件的字符串讀寫#include #include #include int main(void)FILE *fp;char string81;if (fp=fopen(“f:C3exefile2.txt”,”w”)=NULL) printf(“cant open file”);exit(1); while (strlen (gets(string)0) fputs(string, fp)

13、;fputs(“n“,fp);fclose(fp);return 0;例8.5fscanf(文件指針,格式字符串,地址表);fprintf(文件指針,格式字符串,輸出表);功能:按格式對(duì)文件進(jìn)行I/O操作返值:成功,返回I/O的個(gè)數(shù);出錯(cuò)或文件尾,返回EOF例 fprintf(fp,“%d,%6.2f”,i,t); /將i和t按%d,%6.2f格式輸出到fp文件 fscanf(fp,“%d,%f”,&i,&t); /若文件中有3,4.5 ,則將3送入i, 4.5送入t調(diào)用方式:8.3.3 文件的格式化讀寫#include #include #include int main(void)FILE

14、 * fp;char name20;int num;float score;if (fp=fopen(“f:C3exefile3.txt”,”w”)=NULL)printf(“cant open file”);exit(1); 8.3.3 文件的格式化讀寫例8.6printf(“type name,num,score:”);scanf(“%s %d %f”,name,&num,&score);while (strlen (name)1)fprintf(fp,“%s %d %f”,name, num, score);printf(“type name, num, score:”); scanf(

15、“%s %d %f”,name, &num, &score);fclose (fp);return 0;8.3.3 文件的格式化讀寫將數(shù)據(jù)文件file3.txt的數(shù)據(jù)讀回程序并輸出到屏幕上#include #include int main()FILE *fp;char name20;int num;float score;if (fp=fopen(“f:c3exefile3.txt”,”r”)=NULL) printf(“cant open file”); exit(1); while (fscanf(fp, “%s %d %f”,name, &num, &score)!=EOF)print

16、f(“%-20s %6d %6.2fn”, name, num, score);fclose (fp);return 0;8.3.3 文件的格式化讀寫8.3.4 文件的記錄讀寫fread(buffer, size, count, fp);fwrite(buffer, size, count, fp);功能:讀/寫數(shù)據(jù)塊返值:成功,返回讀/寫的塊數(shù);出錯(cuò)或文件尾,返回0說明:用法:fp-文件指針。buffer-是一個(gè)指針。對(duì)fread來說,是讀入數(shù)據(jù)存放地址, 對(duì)fwrite來說,是輸出數(shù)據(jù)的地址。size-數(shù)據(jù)塊的字節(jié)數(shù)。count-要讀寫多少個(gè)size字節(jié)的數(shù)據(jù)塊。例 float f2; F

17、ILE *fp; fp=fopen(“aa.dat”,“rb”); fread(f,4,2,fp);for(i=0;i2;i+) fread(&fi,4,1,fp);例 struct student int num; char name20; char sex; int age; float score3; stud10; for(i=0;i0 前進(jìn)移動(dòng)0 后退移動(dòng)起始點(diǎn)文件開始 SEEK_SET 0文件當(dāng)前位置 SEEK_CUR 1文件末尾 SEEK_END 2例 fseek(fp,100L,0); fseek(fp,50L,1); fseek(fp,-10L,2); 8.4.1 文件位置指

18、針的定位2. ftell函數(shù)用法:fell(文件指針);功能:返回位置指針當(dāng)前位置(用相對(duì)文件開頭的位移量表示)返值:成功,返回當(dāng)前位置指針位置;失敗,返回-1L。8.4.1 文件位置指針的定位3. rewind函數(shù)用法: rewind(文件指針);功能:重置文件位置指針到文件開頭8.4.1 文件位置指針的定位例 對(duì)一個(gè)磁盤文件進(jìn)行顯示和復(fù)制兩次操作#include main() FILE *fp1,*fp2; fp1=fopen(“file1.c,r); fp2=fopen(“file2.c,w); while(!feof(fp1) putchar(fgetc(fp1); rewind(fp

19、1); while(!feof(fp1) fputc(fgetc(fp1),fp2); fclose(fp1); fclose(fp2);8.4.1 文件位置指針的定位8.4.2 文件隨機(jī)讀寫程序舉例例:求文件長(zhǎng)度#includestdio.h main() FILE *fp; long length; fp=fopen(“e:wanga.txt”,r); if(fp=NULL) printf(file not found!n); else fseek(fp,0L,SEEK_END); length=ftell(fp); printf(Length of File is %1d bytesn,

20、length); fclose(fp); 以下程序的功能是( )。#includemain() FILE *fp; fp=fopen(“abc.txt, r+); while(!feof(fp) if(fgetc(fp)=*) fseek(fp,-1L,SEEK_CUR); fputc($,fp); fseek(fp,ftell(fp),SEEK_SET); fclose(fp);A. 將abc文件中所有*替換為$ B. 查找abc文件中所有*C. 查找abc文件中所有$ D. 將abc文件中所有字符替換為$A練習(xí)題. 下面的程序執(zhí)行后,文件testxt.t中的內(nèi)容是( )。 #include

21、 void fun(char *fname,char *st) FILE *myf; int i; myf=fopen(fname,w ); for(i=0;istrlen(st); i+) fputc(sti,myf); fclose(myf); main() fun(test.txt,new world); fun(test.txt,hello,); A. hello, B. new worldhello, C. new world D. hello, rldA用W方式:如果原來不存在該文件,則打開時(shí)新建一個(gè)文件,如果原來已經(jīng)存在,則打開時(shí)將該文件刪除,重新建立一個(gè)文件.程序運(yùn)行后的輸出結(jié)果是( )。#include main() FILE *fp; int i=20,j=30,k,n; fp=fopen(d1.dat, w); fprintf(fp, %dn,i); fprin

溫馨提示

  • 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)論