C語言程序設(shè)計(jì)第十章_第1頁
C語言程序設(shè)計(jì)第十章_第2頁
C語言程序設(shè)計(jì)第十章_第3頁
C語言程序設(shè)計(jì)第十章_第4頁
C語言程序設(shè)計(jì)第十章_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第十章第十章 文件文件C 概述文件:存儲(chǔ)在外部介質(zhì)上數(shù)據(jù)的集合,是操作系統(tǒng)數(shù)據(jù)管理的單位使用數(shù)據(jù)文件的目的 數(shù)據(jù)文件的改動(dòng)不引起程序的改動(dòng)程序與數(shù)據(jù)分離 不同程序可以訪問同一數(shù)據(jù)文件中的數(shù)據(jù)數(shù)據(jù)共享 能長期保存程序運(yùn)行的中間數(shù)據(jù)或結(jié)果數(shù)據(jù)C概述 C語言把文件看作一個(gè)字節(jié)序列,即由一連串的字節(jié)組成,稱為“流(stream)” ,以字節(jié)為單位訪問,沒有記錄的界限文件分類 按文件的邏輯結(jié)構(gòu):F記錄文件:由具有一定結(jié)構(gòu)的記錄組成(定長和不定長)F流式文件:由一個(gè)個(gè)字符(字節(jié))數(shù)據(jù)順序組成 按存儲(chǔ)介質(zhì):F普通文件:存儲(chǔ)介質(zhì)文件(磁盤、磁帶等)F設(shè)備文件:非存儲(chǔ)介質(zhì)(鍵盤、顯示器、打印機(jī)等) 按數(shù)據(jù)的組織

2、形式:文本文件: ASCII文件,每個(gè)字節(jié)存放一個(gè)字符的ASCII碼二進(jìn)制文件:數(shù)據(jù)按其在內(nèi)存中的存儲(chǔ)形式原樣存放C如 int型數(shù)1000000100111 00010000內(nèi)存存儲(chǔ)形式二進(jìn)制形式00110001 00110000 00110000 00110000 00110000ASCII形式文本文件特點(diǎn):存儲(chǔ)量大、速度慢、便于對字符操作二進(jìn)制文件特點(diǎn):存儲(chǔ)量小、速度快、便于存放中間結(jié)果00100111 00010000C磁盤文件輸出文件緩沖區(qū)輸入文件緩沖區(qū)程序數(shù)據(jù)區(qū)a緩沖文件系統(tǒng):緩沖區(qū)指令區(qū)程序用戶數(shù)據(jù)區(qū)磁盤非緩沖文件系統(tǒng):文件處理方法 緩沖文件系統(tǒng):高級文件系統(tǒng),系統(tǒng)自動(dòng)為正在使用的

3、文件開辟內(nèi)存緩沖區(qū) 非緩沖文件系統(tǒng):低級文件系統(tǒng),由用戶在程序中為每個(gè)文件設(shè)定緩沖區(qū)C10.2 文件類型指針 要調(diào)用一個(gè)文件,需要有以下的信息 文件當(dāng)前的讀寫位置 與該文件對應(yīng)的內(nèi)存緩沖區(qū)的地址 緩沖區(qū)中未被處理的字符串 文件操作方式等 緩沖文件系統(tǒng)為每個(gè)正使用的文件在內(nèi)存開辟文件信息區(qū) 文件信息用系統(tǒng)定義的名為FILE的結(jié)構(gòu)體描述 FILE定義在stdio.h中 typedef struct int _fd; /* 文件號 */int _cleft; /* 緩沖區(qū)中剩下的字節(jié)數(shù) */int _mode; /* 文件操作模式 */char * _nextc; /* 下一個(gè)字節(jié)的位置 */cha

4、r * _buff;/*文件緩沖區(qū)位置 */ FILE; C文件類型指針文件名文件使用方式文件類型指針C程序操作系統(tǒng)磁盤文件類型指針指針變量說明: FILE *fp;用法:F文件打開時(shí),系統(tǒng)自動(dòng)建立文件結(jié)構(gòu)體,并把指向它的指針返回來,程序通過這個(gè)指針獲得文件信息,訪問文件F文件關(guān)閉后,它的文件結(jié)構(gòu)體被釋放C10.3 文件的打開與關(guān)閉F 文件操作用庫函數(shù)實(shí)現(xiàn),包含在stdio.hF 文件使用方式:打開文件-文件讀/寫-關(guān)閉文件F 系統(tǒng)自動(dòng)打開和關(guān)閉三個(gè)標(biāo)準(zhǔn)文件:標(biāo)準(zhǔn)輸入-鍵盤 stdin標(biāo)準(zhǔn)輸出-顯示器 stdout標(biāo)準(zhǔn)出錯(cuò)輸出-顯示器 stderrC文件的打開 FILE * fopen(con

5、st char *filename,const char *mode);文件名(可以包含邏輯驅(qū)動(dòng)器、路徑、文件名、擴(kuò)展名)打開方式返回值 功能:按指定方式從磁盤上查找指定的文件或創(chuàng)建一個(gè)新文件。 返值:正常打開,為指向文件結(jié)構(gòu)體的指針;打開失敗,為NULL例:FILE *fp;fp = fopen(file1,r);如果成功打開,返回一個(gè)指向被打開文件的文件信息區(qū)的起始地址;如果打開失敗,返回一個(gè)NULL指針。C文件的打開文件打開方式含義r(只讀)為輸入打開一個(gè)文本文件w(只寫)為輸出打開一個(gè)文本文件a(追加)為追加打開一個(gè)文本文件rb(只讀)為輸入打開一個(gè)二進(jìn)制文件wb(只寫)為輸出打開一個(gè)

6、二進(jìn)制文件ab(追加)為追加打開一個(gè)二進(jìn)制文件r+(讀寫)為讀寫打開一個(gè)文本文件w+(讀寫)為讀寫創(chuàng)建一個(gè)文本文件a+(讀寫)為讀寫打開一個(gè)文本文件rb+(讀寫)為讀寫打開一個(gè)二進(jìn)制文件wb+(讀寫)為讀寫創(chuàng)建一個(gè)二進(jìn)制文件ab+(讀寫)為讀寫打開一個(gè)二進(jìn)制文件C說明: 打開文件的方式,必須與文件的屬性兼容。例如,不能以“w”和“a”方式打開具有“只讀”屬性的文件。但可以以任何方式打開“隱藏”屬性文件。 DOS/Windows中,無“只寫”文件屬性,一個(gè)文件可寫,同時(shí)意味著可讀。 用帶“r”的方式(“r”、“rb”、“r+”、“rb+”)打開文件時(shí),若文件不存在,則返回NULL指針。一般用以下

7、方式檢查是否成功打開:FILE *fp; if (fp=fopen(file1, r) = =NULL ) printf(cannot open this filen);exit(0); /* exit(0)是程序返回操作系統(tǒng)*/ C文件的打開 在中,用帶“a”或帶“w”的方式打開文件時(shí),若文件不存在,則創(chuàng)建該文件。但fopen()函數(shù)仍可能因?yàn)榇疟P寫保護(hù)或目錄滿而失敗。 在中,用帶a或帶w的方式打開文件時(shí),若文件已存在,a方式在原文件后追加數(shù)據(jù),w方式把原文件刪除、并重新創(chuàng)建一個(gè)相同名字的文件。C文件的關(guān)閉 int fclose(FILE *fp)文件打開時(shí)返回的文件類型指針功能:關(guān)閉fp指

8、向的文件,使文件指針變量與文件“脫鉤”,釋放文件結(jié)構(gòu)體和文件指針返值:正常關(guān)閉為0;出錯(cuò)時(shí),非0磁盤文件輸出文件緩沖區(qū)輸入文件緩沖區(qū)程序數(shù)據(jù)區(qū)a緩沖文件系統(tǒng):不關(guān)閉文件可能會(huì)丟失數(shù)據(jù)fcloseC10.4 文件的讀寫 fputc的函數(shù)原型為:int fputc(char ch, FILE *fp)作用:將ch中的字符輸出到fp所指向的文件中,通常用于往文本文件中寫入一個(gè)字符返回值:輸出成功則返回所輸出的字符,失敗則返回EOF fgetc的函數(shù)原型為:int fgetc(FILE *fp)作用:從fp所指向的文件中讀入一個(gè)字符返回值:返回所讀的字符,如發(fā)生錯(cuò)誤或讀到文件結(jié)束符失敗則返回EOFC例

9、 從鍵盤輸入字符,逐個(gè)存到磁盤文件中,直到輸入#“為止#include main() FILE *fp; char ch,*filename=“out.txt”; if(fp=fopen(filename,w)=NULL) printf(cannot open filen);exit(0); printf(Please input string:); ch=getchar(); while(ch!=#) fputc(ch,fp); putchar(ch); ch=getchar(); fclose(fp);例 讀文本文件內(nèi)容,并顯示#include main() FILE *fp; char

10、ch,*filename=“out.txt”; if(fp=fopen(filename,”r)=NULL) printf(cannot open filen); exit(0); while(ch=fgetc(fp)!=EOF) putchar(ch); fclose(fp);判斷文本文件是否結(jié)束C 判斷二進(jìn)制文件是否結(jié)束 while(!feof(fp) c=fgetc(fp); . 例 文件拷貝 feof函數(shù)原型: int feof(FILE *fp)功能:判斷文件是否結(jié)束返值:文件結(jié)束,返回真(非0);文件未結(jié)束,返回0#include main() FILE *in, *out; ch

11、ar ch,infile10,outfile10; scanf(%s,infile); scanf(%s,outfile); if (in = fopen(infile, r)= NULL) printf(Cannot open infile.n); exit(0); if (out = fopen(outfile, w)= NULL) printf(Cannot open outfile.n); exit(0); while (!feof(in) fputc(fgetc(in), out); fclose(in); fclose(out);C fwrite的函數(shù)原型為:unsigned fw

12、rite(void *buffer, unsigned size, unsigned count, FILE *fp)作用:將buffer所指向的內(nèi)存單元開始的內(nèi)存區(qū)中的長度為size的count個(gè)數(shù)據(jù)項(xiàng)寫入fp所指向的文件中返回值:調(diào)用成功則返回實(shí)際輸入的數(shù)據(jù)項(xiàng),即count的值fwrite函數(shù)主要用于二進(jìn)制文件的寫操作,可以將一個(gè)數(shù)據(jù)塊(即一組數(shù)據(jù))寫到文件中。 fread的函數(shù)原型為:unsigned fread(void *buffer, unsigned size, unsigned count, FILE *fp)作用:從fp所指向的文件中將讀出每項(xiàng)長度為size的count個(gè)數(shù)據(jù)

13、項(xiàng),存放到buffer所指向的內(nèi)存單元開始的存儲(chǔ)區(qū)中返回值:返回實(shí)際所讀出的數(shù)據(jù)項(xiàng),即count的值fread函數(shù)主要用于二進(jìn)制文件的讀操作,從文件中讀出一組數(shù)據(jù)。C如果文件以二進(jìn)制形式打開,用fread和fwrite可以讀寫任何類型的信息。、若f 為float型數(shù)組,共10個(gè)元素:fread(f, 4, 10, fp);fread(f, sizeof(float), 10, fp);fread(f, 8, 5, fp);fwrite(f, sizeof(float), 10, fp);、若有結(jié)構(gòu)體類型:struct student long num; char name; float sco

14、re3;stu30;for (i=0; i30; i+) fwrite(&stui, sizeof(struct student), 1, fp);for (i=0; i30; i+) fread(&stui, sizeof(struct student), 1, fp);C說明:、由fputc函數(shù)建立的文件,通常由fgetc函數(shù)讀取,它們的操作對象均為字符,所以稱為字符讀寫函數(shù);、由fwrite函數(shù)建立的文件,通常由fread函數(shù)讀取,它們以數(shù)據(jù)塊為單位進(jìn)行讀寫,所以稱為塊讀寫函數(shù);關(guān)于文件追加的含義:追加數(shù)據(jù)時(shí),文件中的原有數(shù)據(jù)仍然存在,新寫入的數(shù)據(jù)寫到原文件數(shù)據(jù)之后。打開

15、文件時(shí),系統(tǒng)內(nèi)部存在一個(gè)位置指針,指出對數(shù)據(jù)操作的位置。用r、w、rb、wb打開文件時(shí),位置指針指向文件開始處;讀寫時(shí)總是文件的第一個(gè)數(shù)據(jù);用a、ab打開文件時(shí),位置指針則指向整個(gè)文件最后一個(gè)數(shù)據(jù)之后;寫數(shù)據(jù)時(shí)追加到了原有數(shù)據(jù)之后。C例 float f2; FILE *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

16、(i=0;i10;i+) fread(&studi,sizeof(struct student),1,fp);C例 從鍵盤輸入4個(gè)學(xué)生數(shù)據(jù),把他們轉(zhuǎn)存到磁盤文件中去#include #define SIZE 2struct student_type char name10; int num; int age; char addr15;studSIZE;main() int i; for(i=0;iSIZE;i+)scanf(%s%d%d%s,,&studi.num, &studi.age,studi.addr); save();void save()

17、 FILE *fp; int i; if(fp=fopen(stu_dat,wb)=NULL) printf(cannot open filen); return; for(i=0;iSIZE;i+) if(fwrite(&studi,sizeof(struct student_type),1,fp)!=1) printf(file write errorn); fclose(fp);C格式化I/O:fprintf與fscanf 函數(shù)原型:int fprintf(FILE *fp,const char *format,argument,)int fscanf(FILE *fp,cons

18、t char *format,address,) 功能:按格式對文件進(jìn)行I/O操作 返值:成功,返回I/O的個(gè)數(shù);出錯(cuò)或文件尾,返回EOF例 fprintf(fp,“%d,%6.2f”,i,t); / fscanf(fp,“%d,%f”,&i,&t); /例 從鍵盤按格式輸入數(shù)據(jù)存到磁盤文件中去#include main() char s80,c80; int a,b; FILE *fp; if(fp=fopen(test,w)=NULL) puts(cant open file); exit() ; fscanf(stdin,%s%d,s,&a);/*read fro

19、m keaboard*/ fprintf(fp,%s %d,s,a);/*write to file*/ fclose(fp); if(fp=fopen(test,r)=NULL) puts(cant open file); exit(); fscanf(fp,%s%d,c,&b);/*read from file*/ fprintf(stdout,%s %d,c,b);/*print to screen*/ fclose(fp);C字讀寫函數(shù) putw和 getw用來對磁盤讀寫一個(gè)字。使用putw可以往指定文件寫一個(gè)字,即一個(gè)整數(shù);使用getw可以從文件中讀出一個(gè)整數(shù)。1、putw的函數(shù)原型為:int putw(int w, FILE *fp )作用:向fp所指向的文件中寫入一個(gè)字返回值:操作成功返回所輸出的字,不成功則返回EOFputw(20, fp);將整數(shù)20寫到fp所指向的文件中2、getw的函數(shù)原型為:int getw(FILE *fp )作用:從fp所指向的文件中讀出一個(gè)字返回值:讀出成功則返回所讀的字,發(fā)生錯(cuò)誤或文件結(jié)束則返回EOFi=getw(fp);讀取fp所指向文

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論