版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、第十三章第十三章 文文 件件清華大學 自動化系劉連臣2011年12月12日計算機語言與程序設計基礎計算機語言與程序設計基礎 1注注 意意2主要內(nèi)容主要內(nèi)容o 目標:目標:提綱提綱13.1 13.1 文件概述文件概述13.2 13.2 文件類型指針文件類型指針13.3 13.3 文件的打開與關閉文件的打開與關閉13.4 13.4 文件的讀寫文件的讀寫13.5 13.5 文件的定位文件的定位13.6 13.6 出錯的檢測出錯的檢測13.7 13.7 文件輸入輸出小結文件輸入輸出小結 3 13.1 C文件概述文件概述o文件:文件:文件指存儲在外部介質文件指存儲在外部介質(如磁盤如磁盤磁帶磁帶)上數(shù)據(jù)
2、的集合。上數(shù)據(jù)的集合。o操作系統(tǒng)是以文件為單位對數(shù)據(jù)進行管操作系統(tǒng)是以文件為單位對數(shù)據(jù)進行管理的。理的。文件文件程序程序數(shù)據(jù)區(qū)數(shù)據(jù)區(qū)輸輸出出文件緩沖區(qū)文件緩沖區(qū)輸輸入入文件緩沖區(qū)文件緩沖區(qū)4 13.1 C文件概述文件概述文件的分類文件的分類n從用戶觀點來看從用戶觀點來看: :u特殊文件特殊文件( (標準輸入輸出文件或標準設備文件標準輸入輸出文件或標準設備文件) )。u普通文件普通文件( (磁盤文件磁盤文件) )。n從操作系統(tǒng)的角度看從操作系統(tǒng)的角度看: :n每一個與主機相連的輸入輸出設備看作是一個文件每一個與主機相連的輸入輸出設備看作是一個文件。例例:輸入文件:終端鍵盤:輸入文件:終端鍵盤 輸
3、出文件:顯示屏和打印機輸出文件:顯示屏和打印機513.1 C文件概述文件概述o 文件的分類文件的分類n從數(shù)據(jù)的組織形式來看從數(shù)據(jù)的組織形式來看:o ASCII文件文件(文本文件文本文件):每一個字節(jié)放一個每一個字節(jié)放一個ASCII代碼代碼o 二進制文件二進制文件:把內(nèi)存中的數(shù)據(jù)按其在內(nèi)存中的存儲形式原把內(nèi)存中的數(shù)據(jù)按其在內(nèi)存中的存儲形式原樣輸出到磁盤上存放。樣輸出到磁盤上存放。o 例:短例:短整數(shù)整數(shù)10000在內(nèi)存中的存儲形式以及分別按在內(nèi)存中的存儲形式以及分別按ASCII碼形式和二進制形式輸出如下圖所示:碼形式和二進制形式輸出如下圖所示:613.1 C文件概述文件概述o 文件的分類文件的分
4、類n ASCII文件和二進制文件的比較:文件和二進制文件的比較:n ASCII文件文件便于對字符進行逐個處理,也便于便于對字符進行逐個處理,也便于輸出字符。但一般占存儲空間較多,而且要花輸出字符。但一般占存儲空間較多,而且要花費轉換時間。費轉換時間。n 二進制文件二進制文件可以節(jié)省外存空間和轉換時間,但可以節(jié)省外存空間和轉換時間,但一個字節(jié)并不對應一個字符,不能直接輸出字一個字節(jié)并不對應一個字符,不能直接輸出字符形式。符形式。o 一般中間結果數(shù)據(jù)需要暫時保存在外存上,以后又一般中間結果數(shù)據(jù)需要暫時保存在外存上,以后又需要輸入內(nèi)存的,常用二進制文件保存。需要輸入內(nèi)存的,常用二進制文件保存。713
5、.1 C文件概述文件概述o 文件的分類文件的分類n 從對文件的處理方法來看:從對文件的處理方法來看:n 緩沖文件系統(tǒng):緩沖文件系統(tǒng):系統(tǒng)自動地在內(nèi)存區(qū)為每一個系統(tǒng)自動地在內(nèi)存區(qū)為每一個正在使用的文件開辟一個緩沖區(qū)。用緩沖文件正在使用的文件開辟一個緩沖區(qū)。用緩沖文件系統(tǒng)進行的輸入輸出又稱為系統(tǒng)進行的輸入輸出又稱為高級磁盤輸入輸出高級磁盤輸入輸出。n 非緩沖文件系統(tǒng):非緩沖文件系統(tǒng):系統(tǒng)不自動開辟確定大小的系統(tǒng)不自動開辟確定大小的緩沖區(qū),而由程序為每個文件設定緩沖區(qū)。用緩沖區(qū),而由程序為每個文件設定緩沖區(qū)。用非緩沖文件系統(tǒng)進行的輸入輸出又稱為非緩沖文件系統(tǒng)進行的輸入輸出又稱為低級輸?shù)图壿斎胼敵鱿到y(tǒng)
6、。入輸出系統(tǒng)。813.1 C文件概述文件概述說明說明:u在UNIX系統(tǒng)下,用緩沖文件系統(tǒng)來處理文本文件,用非緩沖文件系統(tǒng)來處理二進制文件。uANSI C 標準只采用緩沖文件系統(tǒng)來處理文本文件和二進制文件。uC語言中對文件的讀寫都是用庫函數(shù)來實現(xiàn)。913.2 文件類型指針文件類型指針oTurbo 在在stdio.h文件中有以下的文件類型聲明:文件中有以下的文件類型聲明:typedef structshortlevel; /* fill/empty level of buffer */Unsigned flags; /* File status flags */char fd; /* File d
7、escriptor */unsigned charhold; /* Ungetc char if no buffer */shortbsize; /* Buffer size */unsigned char*buffer; /* Data transfer buffer */unsigned char*curp; /* Current active pointer */unsignedistemp; /* Temporary file indicator */shorttoken; /* Used for validity checking */FILE; /* This is the FIL
8、E object */1013.2 文件類型指針文件類型指針oVisual 在在stdio.h文件中有以下的文件類型聲明:文件中有以下的文件類型聲明:#ifndef _FILE_DEFINEDstruct _iobuf char *_ptr; int _cnt; char *_base; int _flag; int _file; int _charbuf; int _bufsiz; char *_tmpfname; ;typedef struct _iobuf FILE;#define _FILE_DEFINED#endif1113.2 文件類型指針文件類型指針o FILE類型的數(shù)組:類型的
9、數(shù)組:nFILEf5;定義了一個結構體數(shù)組定義了一個結構體數(shù)組f,它有,它有5個元素,個元素,可以用來存放可以用來存放5個文件的信息。個文件的信息。o 文件型指針變量文件型指針變量:nFILE *fp;fp是一個指向是一個指向FILE類型結構體的指針變類型結構體的指針變量??梢允沽???梢允筬p指向某一個文件的結構體變量,從而通過指向某一個文件的結構體變量,從而通過該結構體變量中的文件信息能夠訪問該文件。該結構體變量中的文件信息能夠訪問該文件。n如果有個文件,一般應設個指針變量,使它們分別如果有個文件,一般應設個指針變量,使它們分別指向個文件,以實現(xiàn)對文件的訪問。指向個文件,以實現(xiàn)對文件的訪問。
10、1213.3 文件的打開與關閉文件的打開與關閉一一.文件的打開文件的打開(fopen函數(shù)函數(shù))o 函數(shù)調(diào)用函數(shù)調(diào)用:nFILE *fp;nfpfopen(文件名文件名,使用文件方式使用文件方式););需要打開的文件名,也就是準備訪問的文件的名字;需要打開的文件名,也就是準備訪問的文件的名字;使用文件的方式(使用文件的方式(“讀讀”還是還是“寫寫”等);等);讓哪一個指針變量指向被打開的文件。讓哪一個指針變量指向被打開的文件。o 打開成功返回文件指針;否則返回打開成功返回文件指針;否則返回NULL 。1313.3 文件的打開與關閉文件的打開與關閉o文件使用方式含文件使用方式含 義義 n“r” (
11、只讀只讀)為為輸入輸入打開一個打開一個文本文本文件(文件(只能讀不能寫,文件只能讀不能寫,文件必須存在必須存在)n“w” (只寫只寫)為為輸出輸出打開一個打開一個文本文本文件(文件(只能寫不能讀,將刪只能寫不能讀,將刪除原文件數(shù)據(jù),或者新創(chuàng)建一個文件除原文件數(shù)據(jù),或者新創(chuàng)建一個文件)n“a” (追加追加)向向文本文本文件尾增加數(shù)據(jù)(文件尾增加數(shù)據(jù)(不刪除原來數(shù)據(jù),文件不刪除原來數(shù)據(jù),文件必須存在,位置指針在文件末尾必須存在,位置指針在文件末尾) rb (只讀只讀)為為輸入輸入打開一個打開一個二進制二進制文件文件 wb (只寫只寫)為為輸出輸出打開一個打開一個二進制二進制文件文件ab (追加追加
12、)向向二進制二進制文件尾增加數(shù)據(jù)文件尾增加數(shù)據(jù)1413.3 文件的打開與關閉文件的打開與關閉nr+“ (讀寫讀寫)為為讀讀/寫寫打開一個打開一個文本文本文件文件nw+” (讀寫讀寫)為為讀讀/寫建立寫建立一個新的一個新的文本文本文件文件n“a+” (讀寫讀寫)為讀為讀/寫打開一個文本文件寫打開一個文本文件nrb+“ (讀寫讀寫)為讀為讀/寫打開一個寫打開一個二進制二進制文件文件n“wb+“ (讀寫讀寫)為讀為讀/寫寫建立建立一個新的一個新的二進制二進制文件文件n“ab+” (讀寫讀寫)為讀為讀/寫打開一個寫打開一個二進制二進制文件文件1513.3 文件的打開與關閉文件的打開與關閉o P334
13、(7) 注意注意o 關于文本文件的特殊字符自動變換關于文本文件的特殊字符自動變換n在向計算機在向計算機輸入輸入文本文件時,將文本文件時,將回車和換行符回車和換行符轉換為一轉換為一個個換行符換行符n在在輸出輸出文本文件時把文本文件時把換行符換行符轉換成轉換成回車和換行回車和換行兩個字符。兩個字符。o 在用二進制文件時,不進行轉換,內(nèi)、外存一致在用二進制文件時,不進行轉換,內(nèi)、外存一致o 知道知道stdin,stdout,stderr三個特殊文件三個特殊文件1613.3 文件的打開與關閉文件的打開與關閉二二. 文件的關閉文件的關閉(fclose函數(shù)函數(shù))o 函數(shù)調(diào)用函數(shù)調(diào)用:o fclose(文件
14、指針文件指針););n函數(shù)功能函數(shù)功能: 使文件指針變量不指向該文件,也就是文件使文件指針變量不指向該文件,也就是文件指針變量與文件指針變量與文件“脫鉤脫鉤”,此后不能再通過該指針對原,此后不能再通過該指針對原來與其相聯(lián)系的文件進行讀寫操作。來與其相聯(lián)系的文件進行讀寫操作。o 返回值返回值:n關閉成功返回值為;否則返回關閉成功返回值為;否則返回EOF(-1) 。1713.4 文件的讀寫文件的讀寫一、字符輸入輸出函數(shù)一、字符輸入輸出函數(shù)(fputc()和和fgetc()o fputc函數(shù)函數(shù)o 函數(shù)調(diào)用函數(shù)調(diào)用:nfputc ( ch,fp ) ; o 函數(shù)功能函數(shù)功能: n將字符(將字符(ch
15、的值)輸出到的值)輸出到fp所指向的文件中去。所指向的文件中去。 o 返回值返回值:n如果輸出成功,則返回值就是輸出的字符;如果輸出成功,則返回值就是輸出的字符;n如果輸出失敗,則返回一個如果輸出失敗,則返回一個EOF。1813.4 文件的讀寫文件的讀寫o 函數(shù) putchar()是從fputc()函數(shù)派生出來的n #define putchar(c) fputc(c,stdout)n fflush(stdin)的作用的作用1913.4 文件的讀寫文件的讀寫o fgetc函數(shù)函數(shù)o 函數(shù)調(diào)用函數(shù)調(diào)用:nchfgetc(fp););o 函數(shù)功能函數(shù)功能: n從指定的文件讀入一個字符從指定的文件讀
16、入一個字符,該文件必須是以讀或讀寫方該文件必須是以讀或讀寫方式打開的。式打開的。 o 返回值返回值:n讀取成功一個字符,賦給。讀取成功一個字符,賦給。n如果遇到文件結束符,返回一個文件結束標志如果遇到文件結束符,返回一個文件結束標志EOF 。2013.4 文件的讀寫文件的讀寫文本文件文本文件char ch; /注意是字符變量注意是字符變量ch=fgetc(fp);while (ch!=EOF) putchar(ch); ch=fgetc(fp); 注意:注意:EOF不是可輸不是可輸出字符,因此不能在出字符,因此不能在屏幕上顯示。由于字屏幕上顯示。由于字符的符的ASCII碼不可能碼不可能出現(xiàn),因
17、此出現(xiàn),因此EOF定義為是合適的。定義為是合適的。當讀入的字符值等于當讀入的字符值等于時,表示讀入的時,表示讀入的已不是正常的字符而已不是正常的字符而是文件結束符。是文件結束符。2113.4 文件的讀寫文件的讀寫二進制文件二進制文件int c; /注意是整型變量注意是整型變量c=fgetc(fp);while (!feof(fp) putchar(c); c=fgetc(fp); 注意:注意:ANSI C提供一提供一個個feof()函數(shù)()函數(shù)來判來判斷文件是否真的結束。斷文件是否真的結束。如果是文件結束,函如果是文件結束,函數(shù)數(shù)feof(fp)的值為)的值為(真);否則為(真);否則為(假)
18、。以上也適用(假)。以上也適用于文本文件的讀取。于文本文件的讀取。 2213.4 文件的讀寫(續(xù))fputc和fgetc函數(shù)使用舉例:例例3 3從鍵盤輸入一些字符,逐個把它們送到從鍵盤輸入一些字符,逐個把它們送到磁盤上去,直到輸入一個磁盤上去,直到輸入一個“”為止。為止。 #include #include void main(void) FILE *fp; char ch,filename10; scanf(%s,filename); if(fp=fopen(filename,w)=NULL) printf(cannot open filen); exit(0); /*終止程序*/ ch=g
19、etchar( ); /*接收執(zhí)行scanf語句時最后輸入的回車符 */ ch=getchar( ); /* 接收輸入的第一個字符 */ while(ch!=# fputc(ch,fp);putchar(ch); ch=getchar(); fclose(fp); 運行情況如下: (輸入磁盤文件名) (輸入一個字符串) (輸出一個字符串) 2313.4 文件的讀寫(續(xù))fputcfputc和和fgetcfgetc函數(shù)使用舉例:函數(shù)使用舉例:例例3 3將一個磁盤文件中的信息復制到另一個磁將一個磁盤文件中的信息復制到另一個磁盤文件中盤文件中 。 #include #include main( )F
20、ILE *in,*out; char ch,infile10,outfile10; printf(Enter the infile name:n); scanf(%s,infile); printf(Enter the outfile name:n); scanf(%s,outfile); if(in=fopen(infile,r)=NULL) printf(cannot open infilen); exit(0); if(out=fopen(outfile,w)=NULL) printf(cannot open outfilen); exit(0); while(!feof(in) fpu
21、tc(fgetc(in),out);while(!feof(in) fputc(fgetc(in),out); fclose(in); fclose(out);運行情況如下: (輸入原有磁盤文件名 n:(輸入新復制的磁盤文件名)程序運行結果是將文件中的內(nèi)容復制到中去。 2413.4 文件的讀寫(續(xù))fputcfputc和和fgetcfgetc函數(shù)使用舉例:函數(shù)使用舉例:例例3 3的改進:復制一個二進制文件,利用的改進:復制一個二進制文件,利用mainmain參數(shù),在輸入命令行時將兩個文件名輸入。參數(shù),在輸入命令行時將兩個文件名輸入。 #include #include main(int arg
22、c,char *argv )FILE *in,*out; char ch; if (argc!=3) printf(You forgot to enter a filenamen);exit(0); if(in=fopen(argv1,rb)=NULL)printf(cannot open infilen); exit(0); if(out=fopen(argv2,wb)=NULL) printf(cannot open outfilen); exit(0); while(!feof(in) fputc(fgetc(in),out); fclose(in); fclose(out);運行方法:
23、設經(jīng)編譯連接后得到的可執(zhí)行文件名為a.exe,則在DOS命令工作方式下,可以輸入以下的命令行:a 和,分別輸入到和中,的內(nèi)容為a,的值等于 。2513.4 文件的讀寫文件的讀寫二、數(shù)據(jù)塊讀寫函數(shù)二、數(shù)據(jù)塊讀寫函數(shù)(fread()和和fwrite()o 函數(shù)調(diào)用函數(shù)調(diào)用:nfread (buffer,size,count,fp);nfwrite(buffer,size,count,fp); o 參數(shù)說明:參數(shù)說明:nbuffer:是一個指針。是一個指針。n對對fread 來說,它是讀入數(shù)據(jù)的存放地址。來說,它是讀入數(shù)據(jù)的存放地址。n對對fwrite來說,是要輸出數(shù)據(jù)的地址(均指起始地址)來說,是
24、要輸出數(shù)據(jù)的地址(均指起始地址)。nsize: 要讀寫的字節(jié)數(shù)。要讀寫的字節(jié)數(shù)。ncount: 要進行讀寫多少個要進行讀寫多少個size字節(jié)的數(shù)據(jù)項。字節(jié)的數(shù)據(jù)項。nfp: 文件型指針。文件型指針。2613.4 文件的讀寫文件的讀寫 使用舉例:使用舉例: 若若文件以二進制文件以二進制形式打開:形式打開: fread(f,4,2,fp);fread(f,4,2,fp); 此函數(shù)從此函數(shù)從fpfp所指向的文件中讀入所指向的文件中讀入2 2個個4 4個字節(jié)的數(shù)個字節(jié)的數(shù) 據(jù),存儲到數(shù)組據(jù),存儲到數(shù)組f f中。中。其中,其中,f f為實數(shù)型數(shù)組為實數(shù)型數(shù)組2713.4 文件的讀寫文件的讀寫使用舉例:使
25、用舉例:若有如下結構類型:若有如下結構類型:struct student_typestruct student_typechar name10;char name10; int num; int num; int age; int age; char addr30;stud40; char addr30;stud40;可以用可以用freadfread和和fwritefwrite來進行數(shù)據(jù)的操作:來進行數(shù)據(jù)的操作:forfor(;)(;) fread(&studfread(&studi i,sizeof(struct student-type)sizeof(struct student-type
26、),1 1,fp);fp); forfor(;,)(;,)fwrite(&studfwrite(&studi i,sizeof(struct student-type)sizeof(struct student-type),1 1,fp);fp); 2813.4 文件的讀寫文件的讀寫使用舉例:使用舉例:例例3 3從鍵盤輸入個學生的有關數(shù)據(jù),然后把它們轉存從鍵盤輸入個學生的有關數(shù)據(jù),然后把它們轉存到磁盤文件上去。到磁盤文件上去。 #include #define SIZE 4struct student_typechar name10; int num; int age; char addr15
27、;studSIZE; /*定義結構*/2913.4 文件的讀寫文件的讀寫 void save( )FILE *fp; int i; if(fp=fopen(stu-list,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); /*關閉文件*/ main()int i; for(i=0;iSIZE;i+
28、)/*從鍵盤讀入學生信息*/scanf(%s%d%d%s,,&studi.num, &studi.age,studi.addr);save( );/*調(diào)用save()保存學生信息*/運行情況如下:輸入個學生的姓名、學號、年齡和地址: Z- F - T - L - 3013.4 文件的讀寫文件的讀寫驗證驗證在磁盤文件在磁盤文件“- -”中是否已存在此數(shù)據(jù),中是否已存在此數(shù)據(jù),用以下程序從用以下程序從“- -”文件中讀入數(shù)據(jù),然后在文件中讀入數(shù)據(jù),然后在屏幕上輸出。屏幕上輸出。 #include #define SIZE 4 struct student_typechar na
29、me10; int num; int age; char addr15;studSIZE; main( )int i;FILE*fp;fp=fopen(stu-list,rb);for(i=0;iSIZE;i+) fread(&studi,sizeof(struct student_type),1,fp); printf(%-10s %4d %4d %-15sn,, studi.num,studi. age,studi.addr); fclose (fp);屏幕上顯示出以下信息:Z -F -T -L - 3113.4 文件的讀寫文件的讀寫(續(xù)續(xù))如果已有的數(shù)據(jù)已經(jīng)以如果已有
30、的數(shù)據(jù)已經(jīng)以二進制形式二進制形式存儲在一個磁盤文件存儲在一個磁盤文件“- -”中,要求從其中讀入數(shù)據(jù)并輸出到中,要求從其中讀入數(shù)據(jù)并輸出到“- -”文件中,可以編寫一個文件中,可以編寫一個函數(shù)函數(shù),從磁盤文件中讀二進制數(shù)據(jù)從磁盤文件中讀二進制數(shù)據(jù)。 void void loadload( )( ) FILE FILE * *fp;int i;fp;int i; if(fp=fopen(stu-dat,rb)=NULL) if(fp=fopen(stu-dat,rb)=NULL) printf(cannot open infilen);printf(cannot open infilen); r
31、eturn; return; for(i=0;iSIZE;i+) for(i=0;iSIZE;i+) if( if(freadfread(&studi,sizeof(struct student_type),1,fp)!=1)(&studi,sizeof(struct student_type),1,fp)!=1) if(feof(fp) if(feof(fp) fclose(fp); return;fclose(fp); return; printf(file read errorn);printf(file read errorn); fclose (fp) fclose (fp); 32
32、13.4 文件的讀寫文件的讀寫(續(xù)續(xù))三、格式化讀寫函數(shù)三、格式化讀寫函數(shù)(fprintf()(fprintf()和和fscanf()fscanf()函數(shù)調(diào)用函數(shù)調(diào)用: :nfprintf ( fprintf ( 文件指針,格式字符串,輸出表列);文件指針,格式字符串,輸出表列);nfscanf ( fscanf ( 文件指針,格式字符串,輸入表列);文件指針,格式字符串,輸入表列); 函數(shù)功能函數(shù)功能: : n從磁盤文件中讀入或輸出字符。從磁盤文件中讀入或輸出字符。 例:例:nfprintf(fp,fprintf(fp,”%d,%6.2f%d,%6.2f”,i,t); ,i,t); nfsc
33、anf (fp,fscanf (fp,”%d,%f%d,%f”,&i,&t);,&i,&t);注意:用fprintf和fscanf函數(shù)對磁盤文件讀寫,使用方便,容易理解,但由于在輸入時要將ASCII碼轉換為二進制形式,在輸出時又要將二進制形式轉換成字符,花費時間比較多。因此,在內(nèi)存與磁盤頻繁交換數(shù)據(jù)的情況下,最好不用fprintf和fscanf函數(shù),而用fread和fwrite函數(shù)。3313.4 文件的讀寫文件的讀寫(續(xù)續(xù))三、其他讀寫函數(shù)三、其他讀寫函數(shù)putw()putw()和和getw()getw()函數(shù)調(diào)用函數(shù)調(diào)用: :putw(int i,FILE putw(int i,FILE *
34、 * fp) fp);int i = getw(FILE int i = getw(FILE * * fp) fp); 函數(shù)功能函數(shù)功能: : 對磁盤文件中讀寫一個字(整數(shù))。對磁盤文件中讀寫一個字(整數(shù))。 例:例:putw(10,fp);putw(10,fp);i = getw(fp);i = getw(fp);getwgetw函數(shù)定義如下:函數(shù)定義如下:getw(int i, FILE getw(int i, FILE * *fp)fp) char char * * s; s; s= s=(char*)&i;&i; s0 = getc(fp); s0 = getc(fp); s1 = g
35、etc(fp); s1 = getc(fp); return i; return i; 非標準函數(shù),不要受干擾非標準函數(shù),不要受干擾3413.4 文件的讀寫文件的讀寫(續(xù)續(xù))用戶自定義讀取其他類型數(shù)據(jù)的函數(shù)。用戶自定義讀取其他類型數(shù)據(jù)的函數(shù)。向磁盤文件寫一個實數(shù)(用二進制方式)的函數(shù)向磁盤文件寫一個實數(shù)(用二進制方式)的函數(shù)putfloat :putfloat :putfloat(float num,FILE putfloat(float num,FILE * *fp)fp) char char * * s; s;int count;int count;s = (chars = (char*
36、*)#)#for(count = 0;count 4;count+)for(count = 0;count 4;count+)putc(scount,fp);putc(scount,fp); 如何用如何用 fwrite 實現(xiàn)這個功能?實現(xiàn)這個功能?putfloat(float num,FILE *fp) fwrite(&num,sizeof(float),1,fp); 3513.4 文件的讀寫文件的讀寫(續(xù)續(xù))fgetsfgets函數(shù)函數(shù)函數(shù)作用:函數(shù)作用:從指定文件讀入一個字符串。從指定文件讀入一個字符串。函數(shù)調(diào)用:函數(shù)調(diào)用:fgets(str,n,fp);fgets(str
37、,n,fp);從從fpfp指向的文件輸入指向的文件輸入n-1n-1個字符個字符,在最后,在最后加一個加一個00。返回值:返回值:strstr的首地址。的首地址。3613.4 文件的讀寫文件的讀寫(續(xù)續(xù))fputsfputs函數(shù)函數(shù)函數(shù)作用:函數(shù)作用:向指定的文件輸出一個字符串。向指定的文件輸出一個字符串。函數(shù)調(diào)用:函數(shù)調(diào)用:fputs(fputs(“chinachina”,fp);,fp);第一個參數(shù)可以是字符串常量、字符數(shù)組名或字符型第一個參數(shù)可以是字符串常量、字符數(shù)組名或字符型指針。指針。字符串末尾的字符串末尾的不輸出不輸出。 返回值:返回值:成功,返回值為成功,返回值為0 0;失敗,返回
38、失敗,返回EOFEOF。3713.5 文件的定位文件的定位rewindrewind函數(shù)函數(shù)函數(shù)作用:函數(shù)作用:使位置指針重新返回文件的開頭,無返回值。使位置指針重新返回文件的開頭,無返回值。應用舉例:應用舉例:例例3 3有一個磁盤文件,第一次將它的內(nèi)容顯示在屏幕有一個磁盤文件,第一次將它的內(nèi)容顯示在屏幕上,第二次把它復制到另一文件上。上,第二次把它復制到另一文件上。 #include main()FILE *fp1,*fp2; fp1=fopen(file1.c,r);fp2=fopen(file2.c,w); while(!feof(fp1) putchar(getc(fp1); rewin
39、d(fp1);while(!feof(fp1) putc(getc(fp1),fp2); fclose(fp1);fclose(fp2); 3813.5 文件的定位文件的定位順序讀寫和隨機讀寫順序讀寫和隨機讀寫順序讀寫:順序讀寫:位置指針按字節(jié)位置順序移動。位置指針按字節(jié)位置順序移動。隨機讀寫:隨機讀寫:讀寫完上一個字符(字節(jié))后,并不一定要讀寫其讀寫完上一個字符(字節(jié))后,并不一定要讀寫其后續(xù)的字符(字節(jié)),而可以讀些文件中任意位置后續(xù)的字符(字節(jié)),而可以讀些文件中任意位置上所需要的字符(字節(jié))。上所需要的字符(字節(jié))。3913.5 文件的定位文件的定位fseekfseek函數(shù)(一般用于二
40、進制文件)函數(shù)(一般用于二進制文件)函數(shù)功能:函數(shù)功能:改變文件的位置指針。改變文件的位置指針。函數(shù)調(diào)用形式:函數(shù)調(diào)用形式:fseek(fseek(文件類型指針,位移量,起始點文件類型指針,位移量,起始點) )起始點:文件開頭起始點:文件開頭 SEEK_SET 0SEEK_SET 0 文件當前位置文件當前位置 SEEK_CUR 1SEEK_CUR 1 文件末尾文件末尾 SEEK_END 2SEEK_END 2位移量:以起始點為基點,向前移動的字節(jié)數(shù)。一般位移量:以起始點為基點,向前移動的字節(jié)數(shù)。一般 要求為要求為longlong型。型。4013.5 文件的定位文件的定位fseekfseek函數(shù)
41、應用舉例函數(shù)應用舉例fseek(fpfseek(fp,100L100L,);,);將位置指針移到離文件頭將位置指針移到離文件頭100100個字節(jié)處。個字節(jié)處。fseek(fpfseek(fp,50L50L, ););將位置指針移到離當前位置將位置指針移到離當前位置5050個字節(jié)處。個字節(jié)處。fseek(fpfseek(fp,50L50L, ););將位置指針從文件末尾處向后退個字節(jié)。將位置指針從文件末尾處向后退個字節(jié)。 4113.5 文件的定位文件的定位例例3 3在磁盤文件上存有個學生的數(shù)據(jù)。要求在磁盤文件上存有個學生的數(shù)據(jù)。要求將第、個學生數(shù)據(jù)輸入計算機,并將第、個學生數(shù)據(jù)輸入計算機,并在屏
42、幕上顯示出來。在屏幕上顯示出來。 #include #include #include#include struct student_typestruct student_type char name10; char name10; int num; int num; int age; int age; char sex; char sex; stud10; stud10;main()main() int i;int i; FILE FILE * *fp;fp; if(fp=fopen(stud-dat,rb)=NULL)if(fp=fopen(stud-dat,rb)=NULL) print
43、f(can not open filen); printf(can not open filen); exit(0); exit(0); for(i=0;i10;i+=2) for(i=0;i10;i+=2) fseek(fp,ifseek(fp,i* *sizeof(struct student_type),0);sizeof(struct student_type),0); fread(&studi, sizeof(struct student_type),1,fp);fread(&studi, sizeof(struct student_type),1,fp); printf( printf(“%s %d %d %cn%s %d %d %cn”,,, studi.num,studi.age,studi.sex);studi.num,studi.age,st
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年環(huán)保廢棄物處理服務合同
- 2025年度航空航天研發(fā)設備采購合同解除書3篇
- 2025年度空運貨物出口運輸與國際航空運輸協(xié)會會員服務協(xié)議3篇
- 2024貿(mào)促會指定下載專區(qū)計算機硬件買賣合同3篇
- 一宅一物金銀銅專屬定制配送合同版
- 2024智能無人機研發(fā)與銷售服務合同
- 2024無房產(chǎn)離婚協(xié)議書制作指南與注意事項3篇
- 2025年度鏟車租賃與設備租賃組合服務合同2篇
- 手衛(wèi)生相關知識培訓課件
- 2024微信小程序用戶體驗設計服務合同3篇
- 【傳媒大學】2024年新營銷
- 2025屆廣東省佛山市高三上學期普通高中教學質量檢測(一模)英語試卷(無答案)
- 自身免疫性腦炎課件
- 2024-2030年撰寫:中國第三方檢測項目風險評估報告
- 信陽農(nóng)林學院《新媒體傳播學》2023-2024學年第一學期期末試卷
- 2024建筑公司年終工作總結(32篇)
- 污水廠防汛知識培訓課件
- 建立創(chuàng)新攻關“揭榜掛帥”機制行動方案
- 2024年項目投資計劃書(三篇)
- 2024年浙江省杭州余杭區(qū)機關事業(yè)單位招用編外人員27人歷年管理單位遴選500模擬題附帶答案詳解
- 10kV供配電系統(tǒng)電氣運行規(guī)程
評論
0/150
提交評論