版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第九章 文件l文件概述 l文件的打開與關閉 l文件的讀寫l文件的定位 存儲設備存儲設備 有關存儲有關存儲內部存儲設備內部存儲設備外部部存儲設備外部部存儲設備文件概述 o 概念概念文件一般指存儲在外部介質上數據文件一般指存儲在外部介質上數據的集合。數據是以文件的形式存放在外部介的集合。數據是以文件的形式存放在外部介質質( (如磁盤如磁盤) )上。操作系統(tǒng)是以文件為單位對上。操作系統(tǒng)是以文件為單位對數據進行管理的。數據進行管理的。輸入輸出設備是一種特殊的文件輸入輸出設備是一種特殊的文件C語言把文件看作是一個字符語言把文件看作是一個字符(字節(jié)字節(jié))的序列,的序列,即由一個一個字符即由一個一個字符(字
2、節(jié)字節(jié))的數據順序組成。的數據順序組成。 文件概述 o 分類分類根據數據的組織形式,可分為根據數據的組織形式,可分為ASCIIASCII文件和二進制文件文件和二進制文件。 如,整數如,整數1000010000,在內存中或在磁盤上按二,在內存中或在磁盤上按二進制與進制與ASCIIASCII存儲格式如下圖存儲格式如下圖 0010011100010000內存中存儲形式 00110001001100000011000000110000ASCII存儲形式 0010011100010000二進制存儲形式 文件概述 o 流式文件流式文件 輸入輸出以字節(jié)流或二進制流方式進輸入輸出以字節(jié)流或二進制流方式進行,數
3、據流的開始和結束僅受程序控制而不受物行,數據流的開始和結束僅受程序控制而不受物理符號理符號( (如回車換行符如回車換行符) )控制控制 o 文件的處理方法文件的處理方法 n 緩沖文件系統(tǒng)緩沖文件系統(tǒng) 文件概述 n 非緩沖文件系統(tǒng)非緩沖文件系統(tǒng) 指系統(tǒng)不自動開辟確定指系統(tǒng)不自動開辟確定大小的緩沖區(qū),而由程序為每個文件設定大小的緩沖區(qū),而由程序為每個文件設定緩沖緩沖p描述文件信息的結構體描述文件信息的結構體在緩沖文件系統(tǒng)中,每個被使用的文件都在緩沖文件系統(tǒng)中,每個被使用的文件都在內存中開辟一個區(qū),用來存放有關信息。在內存中開辟一個區(qū),用來存放有關信息。這些信息保存在一個結構體變量中。這些信息保存在
4、一個結構體變量中。文件概述 struct _iobuf char *_ptr; /文件輸入的下一個位置 int _cnt; /當前緩沖區(qū)的相對位置 char *_base; /文件的起始位置 int _flag; /文件標志 int _file; /文件的有效性驗證 int _charbuf; /檢查緩沖區(qū)狀況 int _bufsiz; /緩沖區(qū)的尺寸 char *_tmpfname; /臨時文件名 ;typedef struct _iobuf FILE; 文件概述 定義定義FILEFILE類型的變量類型的變量FILE f5;FILE f5;FILE FILE * *fp;fp;通過通過fpf
5、p指向的結構體可以知道有關文件的信指向的結構體可以知道有關文件的信息,從而可以對打開的文件進行訪問息,從而可以對打開的文件進行訪問文件概述 o 文件的處理過程文件的處理過程創(chuàng)建文件、打開文件、讀寫文件和關閉文件創(chuàng)建文件、打開文件、讀寫文件和關閉文件對已建立的文件操作過程:對已建立的文件操作過程: 聲明文件指針聲明文件指針(*fp) fp=打開文件打開文件 對打開的文件操作對打開的文件操作 關閉文件關閉文件 文件概述 o 文件的處理過程文件的處理過程創(chuàng)建文件、打開文件、讀寫文件和關閉文件創(chuàng)建文件、打開文件、讀寫文件和關閉文件對未建立的文件操作過程對未建立的文件操作過程: 創(chuàng)建文件,獲得訪問文件的
6、指針創(chuàng)建文件,獲得訪問文件的指針 對創(chuàng)建的文件操作對創(chuàng)建的文件操作 關閉文件關閉文件 文件的打開與關閉 o 打開文件的函數打開文件的函數 fopenfopen格式格式: : FILE FILE * *fopen(char fopen(char * *filename,char filename,char * *type)type)參數參數: : filename filename 文件名稱文件名稱 type type 打開文件方式打開文件方式功能:功能:以某一種方式打開存儲在磁盤上的文以某一種方式打開存儲在磁盤上的文 件件返值:正常,返值:正常,指向打開文件的指針指向打開文件的指針;出錯,;出
7、錯,為為空空fopenfopen函數的打開方式的參數表函數的打開方式的參數表type讀寫性讀寫性文本文本/2進制文件進制文件功能功能“r”只讀只讀文本文本打開舊文件打開舊文件“w”只寫只寫文本文本為輸出建立一個新文件為輸出建立一個新文件 “a”添加添加文本文本有就打開無則建新有就打開無則建新“r+”讀讀/寫寫不限制不限制打開打開“w+”讀讀/寫寫不限制不限制為輸出建立一個新文件為輸出建立一個新文件“a+”讀讀/添加添加不限制不限制有就打開無則建新有就打開無則建新注:注:可加的后綴為可加的后綴為t t、b b。加。加b b表示文件以二進制形式進表示文件以二進制形式進 行操作,行操作,t t一般不
8、使用使用一般不使用使用 文件的打開與關閉 o 關閉文件的函數關閉文件的函數 fclosefclose格式格式: : int fclose(FILE int fclose(FILE * *stream)stream) 參數參數: stream : stream 文件名稱文件名稱功能:功能:關閉一個文件或設備關閉一個文件或設備返值:正常,返值:正常,0 0;出錯,;出錯,EOFEOF(-1-1)文件的打開與關閉 o 注意:注意:(1)(1)當文件不再讀當文件不再讀/ /寫時,及時關閉文件,以釋寫時,及時關閉文件,以釋放系統(tǒng)的資源(文件結構變量)。放系統(tǒng)的資源(文件結構變量)。(2)(2)將數據寫回
9、磁盤。將數據寫回磁盤。例例9-1 打開和關閉一個文件打開和關閉一個文件#include “stdio.hvoid main() char a20; FILE *fp; printf(enter name of file:); scanf(%s,a); fp=fopen(a,r); if(fp=NULL) printf(cant open this file:%s,a); exit(0); elseprintf(Congratulations!The file %s is opened!,a);fclose(fp);getch();文件的讀寫 o 文件尾測試函數文件尾測試函數 feof格式格式:
10、 : int feof(FILE *stream)參數參數: stream : stream 文件名稱文件名稱功能:功能:測試文件測試文件fpfp的文件位置指針是否指向的文件位置指針是否指向文件尾文件尾 返值:返值:到了文件末尾到了文件末尾,非非0 0;沒到文件末尾沒到文件末尾,0 0文件的讀寫 o 按字符方式讀函數按字符方式讀函數 fgetcfgetc格式格式: : int fgetc(FILE int fgetc(FILE * *stream)stream)參數參數: stream : stream 文件名稱文件名稱功能:功能:從指定的文件讀入一個字符,該文件從指定的文件讀入一個字符,該文
11、件必須是以讀或讀寫方式打開的必須是以讀或讀寫方式打開的 返值:返值:讀出的字符讀出的字符例例9-2 9-2 將文件中的內容輸出到屏幕將文件中的內容輸出到屏幕main()char ch,file20;FILE *fp;printf(enter files name:);scanf(%s,file);fp=fopen(file,r);if(fp=NULL) printf(cant open file!);else while(!feof(fp) ch=fgetc(fp);putch(ch); fclose(fp); getch(); 文件的讀寫 o 按字符方式寫入函數按字符方式寫入函數 fputc
12、fputc格式格式: : int fputc(int ch,FILE int fputc(int ch,FILE * *stream)stream) 參數參數: ch : ch 要寫入的字符要寫入的字符stream stream 文件名稱文件名稱功能:功能:將字符寫入指定的文件將字符寫入指定的文件 返值:返值:成功,輸入的字符;失敗,返回成功,輸入的字符;失敗,返回 EOF(-1)EOF(-1) 例例9-3 9-3 將鍵盤輸入字符串存入到文件中將鍵盤輸入字符串存入到文件中main() char ch,file20,a100; int i; FILE *fp; printf(enter file
13、s name:); scanf(%s,file); fp=fopen(file,w); if(fp=NULL) printf(no file!); else printf(enter a string:); scanf(%s,a); for(i=0;istrlen(a);i+) fputc(ai,fp); fclose(fp); getch();例例9-4 9-4 將一個磁盤文件中的信息復制到另一個磁盤文件中將一個磁盤文件中的信息復制到另一個磁盤文件中 main() FILE *in, *out; char ch, infile10, outfile10; printf(enter a fil
14、e-in name:); scanf(%s,infile); if(in=fopen(infile,r)=NULL) printf(cannot open infilen); exit(0); printf(enter a file-out name:); scanf(%s,outfile); if(out=fopen(outfile,w)=NULL) printf(cannot open outfilen); exit(0); while(!feof(in) fputc(fgetc(in),out); fclose(in); fclose(out);文件的讀寫 o 按行方式按行方式讀函數讀函
15、數 fgetsfgets格式格式: : char char * *fgets(char fgets(char * *string,int n,FILE string,int n,FILE * *stream)stream)參數參數: : stringstring 讀出字符串的首地址讀出字符串的首地址 n n 讀出字符數讀出字符數 stream stream 文件結構體指針文件結構體指針功能:功能:從文件中讀取一個長度為從文件中讀取一個長度為n-1n-1的字符串存入的字符串存入 stringstring中中, ,讀入讀入n-1n-1個字符結束之前遇到換行符或者個字符結束之前遇到換行符或者EOF(
16、EOF(文件結束符文件結束符) ),則結束讀入,則結束讀入 返值:返值:讀出字符串的首地址或空讀出字符串的首地址或空文件的讀寫 o 按行方式按行方式寫函數寫函數 fputsfputs格式格式: : int fputs(char int fputs(char * *string,FILE string,FILE * *stream)stream)參數參數: : stringstring 字符串的首地址字符串的首地址 streamstream文件結構體指針文件結構體指針功能:功能:把以把以stringstring為起始地址的字符串輸出到為起始地址的字符串輸出到fpfp指指定的文件中,最后的定的文件
17、中,最后的00不輸出不輸出 返值:寫入到文件成功,返回返值:寫入到文件成功,返回0 0;否則返回非;否則返回非0 0例例9-59-5將文件將文件f1f1的內容按行方式進行讀的內容按行方式進行讀/ /寫復制到寫復制到文件文件f2f2中中 main()FILE *in,*out;char f120,f220,str128;printf(nEnter a source filename:);gets(f1);printf(nEnter a destination filename:);gets(f2);if(in=fopen(f1,r)=NULL) /*打開源文件打開源文件*/printf(cann
18、ot open file %sn,f1);exit(0); if(out=fopen(f2,w)=NULL) /*打開目標文件打開目標文件*/printf(cannot open file %sn,f2);exit(0); while(!feof(in)fputs(fgets(str,128,in),out); /*按行方式進行讀按行方式進行讀/寫寫*/fclose(in);fclose(out);文件的讀寫 o 按格式讀按格式讀函數函數 fscanf()fscanf()格式格式: :int fscanf(FILE int fscanf(FILE * *stream,charstream,ch
19、ar* *format,argument,format,argument,) 參數參數: stream : stream 文件結構體指針文件結構體指針 format format 格式字符串格式字符串功能:功能:按格式從文件按格式從文件streamstream中讀取數據中讀取數據 返值:返值:讀入成功,函數返回所讀數據的個數讀入成功,函數返回所讀數據的個數;否則返回;否則返回 EOF EOF 文件的讀寫 o 按格式寫按格式寫函數函數 fprintffprintf()()格式格式: :int fprintf(FILE int fprintf(FILE * *stream,char stream,
20、char * *format,argument,format,argument,) 參數參數: stream : stream 文件名文件名 format format 格式字符串格式字符串功能:功能:按格式寫取數據到文件按格式寫取數據到文件streamstream中中 返值:寫入成功,返值:寫入成功,函數返回寫入數據的個數函數返回寫入數據的個數; 否則返回否則返回EOF EOF 例例9-6 9-6 將鍵盤輸入字符串存入到文件中將鍵盤輸入字符串存入到文件中main() char c1=A,c2,s110=Program,s210; int i1=168,i2; float f1=95.56,f
21、2; FILE *fp; fp=fopen(fomat.txt,w ); printf(%c,%d,%7.2f,%sn,c1,i1,f1,s1); fprintf(fp,%c,%d,%7.2f,%sn,c1,i1,f1,s1); fclose(fp); if(fp=fopen(fomat.txt,r)=NULL) printf(Can not open filen); exit(1); fscanf(fp,%c,%d,%f,%s,&c2,&i2,&f2,s2); printf(%c,%d,%7.2f,%sn,c2,i2,f2,s2); fclose(fp); getch
22、(); 文件的讀寫 o 按塊方式寫函數按塊方式寫函數 fwritefwrite格式格式: : int fwrite(void int fwrite(void * *ptr, int size, int nitems, ptr, int size, int nitems, FILE FILE * *stream);stream); 參數參數:ptr: :ptr: 寫入數據存放區(qū)域的首地址寫入數據存放區(qū)域的首地址 sizesize:一次寫入的字節(jié)數:一次寫入的字節(jié)數 nitemsnitems:寫的次數:寫的次數 stream stream :文件指針:文件指針 功能:功能:以二進制形式以二進制形式
23、將數據塊寫入到將數據塊寫入到streamstream所指定所指定的文件中的文件中返值:寫入成功,返回返值:寫入成功,返回1 1;否則返回;否則返回0 0文件的讀寫 o 按塊方式讀函數按塊方式讀函數 freadfread格式格式: : int fread(void int fread(void * *ptr, int size, ptr, int size, int nitemsint nitems, , FILE FILE * *stream);stream); 參數參數:ptr: :ptr: 讀入數據存放區(qū)域的首地址讀入數據存放區(qū)域的首地址 sizesize:一次讀入的字節(jié)數:一次讀入的字節(jié)
24、數 nitems nitems :讀的次數:讀的次數? stream stream :文件指針:文件指針 功能:功能:從從streamstream所指定的文件中所指定的文件中以二進制形式以二進制形式讀取讀取數據塊。數據塊。 返值:讀出成功,返回返值:讀出成功,返回1 1;否則返回;否則返回0 0文件的讀寫例例9-7 9-7 現有一個現有一個三人三人工作組信息,每個人包括編工作組信息,每個人包括編號、姓名及年齡,號、姓名及年齡,從鍵盤輸入這三個人的信息從鍵盤輸入這三個人的信息,并并存入文件存入文件file1file1中。中。 結構體定義:結構體定義:struct worker int num;
25、char *name;int age;main() /* 讀入數據讀入數據 */ struct worker w3,x3; int i; char a20;/ 存放輸入的名字存放輸入的名字 FILE *fp; for(i=0;i3;i+) printf(enter number of worker:); scanf(%d,&wi.num); printf(enter name of worker:); while(!(strlen(gets(a);/ 必須要輸入必須要輸入 =(char *)malloc(strlen(a)+1); strcpy(,a);/
26、賦值賦值 printf(enter age of worker:); scanf(%d,&wi.age); /*寫入文件寫入文件*/fp=fopen(zxd.txt,wb+); for(i=0;i3;i+) fwrite(&wi,strlen()+5,1,fp); fclose(fp);文件的讀寫/*從文件中讀出并輸出到屏幕從文件中讀出并輸出到屏幕*/fp=fopen(zxd.txt,rb+); for(i=0;i3;i+) fread(&xi,strlen()+5,1,fp); fclose(fp); printf(num name age
27、n); printf(-n); for(i=0;i3;i+) printf(%2d %-15s%4dn,xi.num,,xi.age); getch();文件的定位 o 函數函數 rewind()rewind()格式格式: :void rewind(FILE void rewind(FILE * *stream)stream) 參數參數: stream : stream 文件名文件名 功能:功能:使位置指針重新返回文件的開頭使位置指針重新返回文件的開頭 返值:返值:文件的定位例例9-8 9-8 文件文件stu.txtstu.txt中存放學生的學號和成績。數中存放學生的學號和成績。
28、數據從鍵盤輸入,而且用據從鍵盤輸入,而且用0 0結束輸入。建立文件后,結束輸入。建立文件后,將學生數據從頭輸出到屏幕上。將學生數據從頭輸出到屏幕上。#include #include main()main() FILE FILE * *fp;fp;int num;int num;float score;float score;fp=fopen(stu.txt,w+);fp=fopen(stu.txt,w+);scanf(%d%f,&num,&score);scanf(%d%f,&num,&score);while(num!=0)while(num!=0) fpr
29、intf(fp,%d,%fn,num,score);fprintf(fp,%d,%fn,num,score);scanf(%d%f,&num,&score);scanf(%d%f,&num,&score); rewind(fp);rewind(fp);while(!feof(fp)while(!feof(fp) fscanf(fp,%d,%f,&num,&score);fscanf(fp,%d,%f,&num,&score);printf(num=%d,score=%fn,num,score);printf(num=%d,scor
30、e=%fn,num,score); fclose(fp);fclose(fp); 文件的定位ofseek()fseek()函數函數 格式格式: :int fseek(FILE int fseek(FILE * *fp,long offset,int base)fp,long offset,int base)參數參數: fp: fp:文件指針:文件指針 offsetoffset:相對位移量:相對位移量( (即相對于即相對于basebase的位移量的位移量) ) base base:是計算相對位移量的基點,值可為:是計算相對位移量的基點,值可為0 0、1 1和和2 2 basebase取值取值 命
31、名命名 含義含義0 SEEK-SET 0 SEEK-SET 文件開頭文件開頭1 SEEK-CUR 1 SEEK-CUR 文件當前位置文件當前位置2 SEEK-END 2 SEEK-END 文件末尾文件末尾 功能:功能:使使fpfp所指定的文件的讀得位置指針被設置為相對于所指定的文件的讀得位置指針被設置為相對于basebase的的 的位移量為的位移量為offsetoffset的位置的位置 返值:正常,當前指針位置;異常,返值:正常,當前指針位置;異常,-1-1 文件的定位例例9-9 9-9 在文件在文件stufile.txtstufile.txt中,存有中,存有100100個學生的信息,他們按學
32、號個學生的信息,他們按學號1 1、2 2、3 3、-、100100的順序排列。現要求把單號學生的信息顯的順序排列?,F要求把單號學生的信息顯示在屏幕上。示在屏幕上。#include #include struct stu_type /struct stu_type /* *定義結構體定義結構體* */ / int num; /int num; /* *定義結構體成員定義結構體成員* */ /char name20;char name20;int age;int age;char clas;char clas;stud; stud; 文件的定位main() int n;FILE *fp; /*定義
33、文件類型指針定義文件類型指針*/if(fp=fopen(stufile.txt,rb)=NULL) /*打開文件打開文件*/puts(The file can not openedn);exit(1);for (n=1;n100;n+=2)fseek(fp,n*sizeof(struct stu_type),0); fread(&stud,sizeof(struct stu_type),1,fp) ; /結合起來用結合起來用 printf(%d%s%d%sn,stud.num,,stud.age,stud.clas);fclose(fp) ; /*關閉文件關閉文件*/ 文件的定位o ftell()ftell()函數函數格式:格式:long ftell(FILE long ftell(FILE * *stream)stream)參數:參數:fpfp為文件指針。為文件指針。功能:獲得當前文件指針的位置功能:獲得當前文件指針的位置返回:相對于文件開頭的位移量返回:相對于文件開頭的位移量( (以字節(jié)為以字節(jié)為單位單位) )。出錯。出錯( (如文件不存在如文件不存在) ),值為,值為-1-1。 文件的定位例例9-10 9-10 在
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度供應鏈管理SaaS平臺合同2篇
- 二零二五年度房地產項目招投標代理合同6篇
- 2025年度消防系統(tǒng)智能化改造與運維服務合同范本3篇
- 二零二五年度教育培訓機構入學合同范本
- 2025年度物業(yè)社區(qū)志愿者服務管理協(xié)議范本3篇
- 二零二五年度農業(yè)項目財務支持與合同履約監(jiān)管協(xié)議3篇
- 自動控制pd的課程設計
- 課文橋課程設計
- 二零二五年度房產析產及財產分配執(zhí)行協(xié)議3篇
- 論文閱讀與審美課程設計
- 工商企業(yè)管理畢業(yè)論文范文(篇一)
- 電動叉車充電區(qū)安全規(guī)程
- 手術室中心吸引突然停止的應急預案
- 選礦廠管理新規(guī)制度匯編
- G -B- 43630-2023 塔式和機架式服務器能效限定值及能效等級(正式版)
- 工作總結中的不足之處
- 電科院:儲能構網控制及并網測試
- 廣東省初級中學學生學籍表
- 生鮮超市供貨超市供貨服務方案
- 銀行營銷拆遷戶活動方案
- 25道長江存儲固件工程師崗位常見面試問題含HR常問問題考察點及參考回答
評論
0/150
提交評論