蘭州大學 計算機學院---C語言第十章ppt ---文件課件_第1頁
蘭州大學 計算機學院---C語言第十章ppt ---文件課件_第2頁
蘭州大學 計算機學院---C語言第十章ppt ---文件課件_第3頁
蘭州大學 計算機學院---C語言第十章ppt ---文件課件_第4頁
蘭州大學 計算機學院---C語言第十章ppt ---文件課件_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1第十章 文件狄長艷2015-6-21目錄什么是文件?C文件是如何存儲的?什么是文本文件和二進制文件?怎樣打開、關(guān)閉文件?怎樣編寫文件讀寫程序?怎樣編寫程序,實現(xiàn)簡單的數(shù)據(jù)處理?10.1 C文件概述文件:存儲在外部介質(zhì)上數(shù)據(jù)的集合,是操作系統(tǒng)數(shù)據(jù)管理的單位。文件的存在形式F文件的存在形式:文件名+文件內(nèi)容。 F文件內(nèi)容:是一個字符(字節(jié))序列,即由一個個字符 (字節(jié))的數(shù)據(jù)順序組成。對文件的存取是以 字符(字節(jié))為單位的,這類文件稱為流式文件。 使用數(shù)據(jù)文件的目的1、數(shù)據(jù)文件的改動不引起程序的改動程序與數(shù)據(jù)分離2、不同程序可以訪問同一數(shù)據(jù)文件中的數(shù)據(jù)數(shù)據(jù)共享3、能長期保存程序運行的中間數(shù)據(jù)或結(jié)

2、果數(shù)據(jù) c中將文件看成是字符構(gòu)成的序列,即字符流,它的基本存儲單位是字節(jié)。(即c中對文件的存取是以字符為單位的)。文件分類按數(shù)據(jù)的組織形式:按數(shù)據(jù)的組織形式:F文本文件: ASCII文件,每個字節(jié)存放一個字符的ASCII碼(直接顯示,但浪費存儲空間)F二進制文件:數(shù)據(jù)按其在內(nèi)存中的存儲形式原樣存放。(不能顯示,但節(jié)省存儲空間)2021-10-205如 int型數(shù)100000010011100010000內(nèi)存存儲形式0010011100010000二進制形式0011000100110000001100000011000000110000ASCII形式文本文件特點:存儲量大、速度慢、便于對字符操作

3、二進制文件特點:存儲量小、速度快、便于存放中間結(jié)果 文件處理方法 緩沖文件系統(tǒng):高級文件系統(tǒng),系統(tǒng)自動為正在使用的文件開辟內(nèi)存緩沖區(qū) 非緩沖文件系統(tǒng):低級文件系統(tǒng),由用戶在程序中為每個文件設(shè)定緩沖區(qū) 內(nèi)存單元內(nèi)存單元 內(nèi)存單元內(nèi)存單元數(shù)據(jù)數(shù)據(jù) 緩沖器緩沖器512字字節(jié)節(jié)文件文件由操作由操作系統(tǒng)自系統(tǒng)自動完成動完成程序控制程序控制由于磁盤速度慢由于磁盤速度慢直接把數(shù)據(jù)寫到磁盤效率很低直接把數(shù)據(jù)寫到磁盤效率很低 向磁盤輸出數(shù)據(jù):數(shù)據(jù) 緩沖區(qū),裝滿緩沖區(qū)后 磁盤文件。從磁盤讀入數(shù)據(jù):先一次性從磁盤文件將一批數(shù)據(jù)輸入到緩沖區(qū),然后再從緩沖區(qū)逐個讀入數(shù)據(jù)到變量。數(shù)據(jù)數(shù)據(jù) 緩沖器緩沖器512字節(jié)字節(jié)文件文

4、件由操作由操作系統(tǒng)自系統(tǒng)自動完成動完成程序控制程序控制文件名文件名 內(nèi)存單元內(nèi)存單元 內(nèi)存單元內(nèi)存單元用什么標識用什么標識10.2 文件指針用文件指針指示文件緩沖區(qū)中具體讀寫的位置l FILE *fp; 如何使如何使fp與具體與具體文件文件掛鉤掛鉤? ?文件打開時,系統(tǒng)自動建立文件結(jié)構(gòu)體,并把指向它的指針返回來,程序通過這個指針獲得文件信息,訪問文件文件關(guān)閉后,它的文件結(jié)構(gòu)體被釋放數(shù)據(jù)數(shù)據(jù)緩沖器緩沖器512字節(jié)字節(jié)文件文件由操作由操作系統(tǒng)自系統(tǒng)自動完成動完成程序控制程序控制同時使用多個文件時,每個文件都有緩沖區(qū),用不同的文件指針分別指示。typedef struct short level;

5、/* 緩沖區(qū)使用量 */ unsigned flags; /* 文件狀態(tài)標志 */ char fd; /* 文件描述符 */ short bsize; /* 緩沖區(qū)大小 */ unsigned char *buffer; /* 文件緩沖區(qū)的首地址 */ unsigned char *curp; /* 指向文件緩沖區(qū)的工作指針 */ unsigned char hold; /* 其他信息 */ unsigned istemp; short token; FILE;10.1 將短句“Hello World”寫入到文件把短句 “Hello World!” 保存到磁盤文件f1.txt中。#includ

6、e #include int main(void) FILE *fp;/* 定義文件指針*/ if( ( fp = fopen(f1.txt, w) ) = NULL)/* 打開文件 */ printf(File open error!n); exit(0); fprintf( fp, %s, Hello World! ); /* 寫文件 */ if( fclose( fp ) ) /* 關(guān)閉文件 */ printf( Can not close the file!n ); exit(0); return 0;例10-1 源程序10.3 文件的打開與關(guān)閉文件使用方式:打開文件-文件讀/寫-關(guān)閉

7、文件C文件操作用庫函數(shù)實現(xiàn),包含在stdio.h打開文件fopen ( ) 函數(shù)原型:FILE *fopen(char *name,char *mode) 功能:按指定方式打開文件 返值:正常打開,為指向文件結(jié)構(gòu)體的指針;打開失敗,為NULL要打開的文件名例 文件打開與測試 FILE *fp; fp=fopen(“aa.c”,“w”); if(fp=NULL) printf(“File open error!n”); exit(0); 例 FILE *fp; fp= fopen (“c:fengyibkctest.dat”,”r”); 例 FILE *fp; char *filename=“c

8、:fengyibkctest.dat” fp= fopen(filename,”r”); “r+/rb+” (讀寫)“a/ab” (追加)“w/wb” (只寫)“r/rb” (只讀)“w+/wb+” (讀寫)“a+/ab+” (讀寫)為輸入打開一個文本/二進制文件為輸出打開或建立一個文本/二進制文件為讀/寫打開一個文本/二進制文件為讀/寫建立一個文本/二進制文件為讀/寫打開或建立一個文本/二進制文件向文本/二進制文件尾追加數(shù)據(jù)文件使用方式含義2021-10-2013文件使用方式說明文件使用方式說明 基本方式字符(單獨使用是對文本文件):基本方式字符(單獨使用是對文本文件): r 僅為讀而打開。

9、僅為讀而打開。 ( (只讀文件只讀文件) ) w 僅為寫而打開。僅為寫而打開。 ( (建立新文件建立新文件) ) a 僅為添加而打開。僅為添加而打開。( (寫舊文件寫舊文件) ) 按二進制格式讀寫文件(基本方式字符按二進制格式讀寫文件(基本方式字符+“b”) b 輔助說明,按二進制格式讀寫文件。輔助說明,按二進制格式讀寫文件。 同時進行讀寫文件(基本方式字符同時進行讀寫文件(基本方式字符+“b”+“+”) + 輔助說明,可同時進行讀和寫文件。輔助說明,可同時進行讀和寫文件。 例如:例如:fp=fopen(“stu.dat”,“rb”);例如:例如:fp=fopen(“stu.dat”,“r+”

10、);2021-10-2014文件打開時返回的文件類型指針磁盤文件輸出文件緩沖區(qū)輸入文件緩沖區(qū)程序數(shù)據(jù)區(qū)a緩沖文件系統(tǒng):fclose不關(guān)閉文件可能會丟失數(shù)據(jù)文件關(guān)閉fclose 作用:使文件指針變量與文件“脫鉤”,釋放文件結(jié)構(gòu)體和文件指針 函數(shù)原型:int fclose(FILE *fp) 功能:關(guān)閉fp指向的文件 返值:正常關(guān)閉為0;出錯時,非02021-10-2015例:例:#include main() FILE *fp; if(fp=fopen(stu.dat,r) =NULL) printf(file not found.); exit(0); else printf(file ope

11、ned ok!); fclose(fp); 程序運行結(jié)果:如果TC默認路徑下存在文件stu.dat,屏幕上會顯示file open ok!,否則屏幕上顯示file not found.常使用此方法打常使用此方法打開一個文件開一個文件Exit 函數(shù)的功能是關(guān)閉所函數(shù)的功能是關(guān)閉所有文件,終止程序運行。有文件,終止程序運行。exit(0)為正常終止程序為正常終止程序2021-10-201610.4 文件的讀寫J 字符I/O:fputc與fgetcFfputc 函數(shù)原型:int fputc(ch, fp) 功能:把字符ch寫入fp指向的文件中 返值:正常,返回c;出錯,為EOF(-1)Ffgetc

12、函數(shù)原型:int fgetc(fp) 功能:從fp指向的文件中讀取一字節(jié)代碼 返值:正常,返回讀到的代碼值;讀到文件尾或出錯,為EOF2021-10-2017 判斷二進制文件是否結(jié)束 while(!feof(fp) c=fgetc(fp); . 例 從鍵盤輸入字符,逐個 存到磁盤文件中,直到 輸入#“為止#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:

13、); ch=getchar(); while(ch!=#) fputc(ch,fp); putchar(ch); ch=getchar(); fclose(fp);例 讀文本文件內(nèi)容, 并顯示#include main() FILE *fp; char 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é)束&feofF函數(shù)原型:函數(shù)原型: int fe

14、of(FILE *fp)F功能:判斷文件是否結(jié)束功能:判斷文件是否結(jié)束F返值:文件結(jié)束,返回真(非返值:文件結(jié)束,返回真(非0);文件未結(jié)束,返回);文件未結(jié)束,返回02021-10-2018J 數(shù)據(jù)塊I/O:fread與fwrite 一般調(diào)用形式:fread(buffer, size, count, fp)fwrite(buffer, size, count, fp)F功能:讀功能:讀/寫數(shù)據(jù)塊寫數(shù)據(jù)塊F返值:成功,返回讀返值:成功,返回讀/寫的塊數(shù);出錯或文件尾,返回寫的塊數(shù);出錯或文件尾,返回0F說明:說明:buffer: 指向要輸入/輸出數(shù)據(jù)塊的首地址的指針size: 每個要讀/寫的數(shù)

15、據(jù)塊的大小(字節(jié)數(shù))count: 要讀/寫的數(shù)據(jù)塊的個數(shù)fp: 要讀/寫的文件指針fread與fwrite 一般用于二進制文件的輸入/輸出2021-10-2019例 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(i=0;i10;i+) fread(&studi,sizeof(struct

16、student),1,fp);2021-10-2020例 從鍵盤輸入4個學生數(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(); display();void save() FILE *fp; int i; if(fp=fopen(

17、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);void display() FILE *fp; int i; if(fp=fopen(stu_dat,rb)=NULL) printf(cannot open filen); return; for(i=0;iSIZE;i+) fread(&studi,sizeof(s

18、truct student_type),1,fp); printf(%-10s %4d %4d %-15sn,, studi.num,studi.age,studi.addr); fclose(fp);ch13_4.c2021-10-2021J 格式化I/O:fprintf與fscanf 一般調(diào)用形式:fprintf(fp, char *format,argument,)fscanf(fp, char *format,address,)F功能:按格式對文件進行功能:按格式對文件進行I/O操作操作F返值:成功返值:成功,返回返回I/O的個數(shù)的個數(shù);出錯或文件尾出錯或文件尾,返

19、回返回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例 從鍵盤按格式輸入數(shù)據(jù)存到磁盤文件中去#include main() char s80,c80; int a,b; FILE *fp; if(fp=fopen(test,w)=NULL) puts(cant open file); exit(0) ; scanf(%s%d,s,&a);/*read from keaboard*/ fprintf(fp,%s %d,s,a

20、);/*write to file*/ fclose(fp); if(fp=fopen(test,r)=NULL) puts(cant open file); exit(0); fscanf(fp,%s%d,c,&b);/*read from file*/ printf(%s %d,c,b);/*print to screen*/ fclose(fp);2021-10-2022J字符串I/O: fgets與fputsF一般調(diào)用形式:一般調(diào)用形式:fgets(char *s,int n,FILE *fp)fputs(char *s,FILE *fp)p功能:從fp指向的文件讀/寫一個字符串p返值

21、: fgets正常時返回讀取字符串的首地址;出錯或文件尾,返回NULL fputs正常時返回寫入的最后一個字符;出錯為EOF例 從鍵盤讀入字符串存入文件,再從文件讀回顯示fgets從fp所指文件讀n-1個字符送入s指向的內(nèi)存區(qū),并在最后加一個0(若讀入n-1個字符前遇換行符或文件尾(EOF)即結(jié)束)fputs把s指向的字符串寫入fp指向的文件,不寫入空字符#includemain() FILE *fp; char string81; if(fp=fopen(file.txt,w)=NULL) printf(cannt open file);exit(0); while(strlen(gets(

22、string)0) fputs(string,fp); fputs(n,fp); fclose(fp); if(fp=fopen(file.txt,r)=NULL) printf(cannt open file);exit(0); while(fgets(string,81,fp)!=NULL) fputs(string,stdout); fclose(fp);2021-10-2023J其他文件讀寫函數(shù)Fputw()函數(shù):函數(shù):一般調(diào)用形式: 功能:對磁盤文件寫一個字(整數(shù))。Fgetw()函數(shù)函數(shù)一般調(diào)用形式: 功能:對磁盤文件讀一個字(整數(shù))。例:例:putw(10,fp); 將整數(shù)將整數(shù)

23、10輸出到輸出到fp指向的文件中去指向的文件中去. i=getw(fp); 從磁盤文件讀入一個數(shù)到內(nèi)存變量。從磁盤文件讀入一個數(shù)到內(nèi)存變量。變量名= getw(文件指針); putw(整數(shù),文件指針); 2021-10-202410.5 文件的定位J 幾個概念 文件位置指針-指向當前讀寫位置的指針 讀寫方式 順序讀寫:位置指針按字節(jié)位置順序移動 隨機讀寫:位置指針按需要移動到任意位置J rewind函數(shù) 函數(shù)原型: void rewind(FILE *fp) 功能:重置文件位置指針到文件開頭 返值:無例 對一個磁盤文件進行顯示和復制兩次操作#include main() FILE *fp1,*

24、fp2; fp1=fopen(ch13_1.c,r); fp2=fopen(ch13_11.c,w); while(!feof(fp1) putchar(fgetc(fp1); rewind(fp1); while(!feof(fp1) fputc(fgetc(fp1),fp2); fclose(fp1); fclose(fp2);ch13_6.c2021-10-2025J fseek函數(shù) 函數(shù)原型: int fseek(FILE *fp,long offset,int whence) 功能:改變文件位置指針的位置 返值:成功,返回0;失敗,返回非0值文件指針位移量(以起始點為基點,移動的字節(jié)

25、數(shù))0 向后移動0 向前移動起始點文件開始 SEEK_SET 0文件當前位置 SEEK_CUR 1文件末尾 SEEK_END 2例 fseek(fp,100L,0); fseek(fp,50L,1); fseek(fp,-10L,2); Jftell函數(shù)F函數(shù)原型:函數(shù)原型: long ftell(FILE *fp)F功能:返回位置指針當前位置功能:返回位置指針當前位置(用相對文件開頭的位移量表示用相對文件開頭的位移量表示)F返值:成功,返回當前位置指針位置;失敗,返回返值:成功,返回當前位置指針位置;失敗,返回-1L,2021-10-202610.6 出錯的檢測J ferror函數(shù) 函數(shù)原型

26、: int ferror(FILE *fp) 功能:測試文件是否出現(xiàn)錯誤 返值:未出錯,0;出錯,非0 說明 每次調(diào)用文件輸入輸出函數(shù),均產(chǎn)生一個新的ferror函數(shù)值,所以應(yīng)及時測試 fopen打開文件時,ferror函數(shù)初值自動置為02021-10-2027J clearerr函數(shù) 函數(shù)原型: void clearerr(FILE *fp) 功能:使文件錯誤標志置為0 返值:無 說明:出錯后,錯誤標志一直保留,直到對同一文件調(diào)clearerr(fp)或rewind或任何其它一個輸入輸出函數(shù)例 ferror()與clearerr()舉例#include int main(void) FILE *

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論