第10章 C語言文件_第1頁
第10章 C語言文件_第2頁
第10章 C語言文件_第3頁
第10章 C語言文件_第4頁
第10章 C語言文件_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第第1010章章 C C語言文件語言文件下一頁下一頁返返 回回本章要點本章要點文件的概念文件的概念文件指針文件指針文件打開與關(guān)閉文件打開與關(guān)閉文件讀寫操作文件讀寫操作文件定位文件定位學(xué)習(xí)方法建議學(xué)習(xí)方法建議 學(xué)習(xí)本章內(nèi)容時,首先要理解文件的概念及分類,然學(xué)習(xí)本章內(nèi)容時,首先要理解文件的概念及分類,然后掌握文件指針及文件位置指針的區(qū)別,在此基礎(chǔ)上學(xué)習(xí)后掌握文件指針及文件位置指針的區(qū)別,在此基礎(chǔ)上學(xué)習(xí)文件的打開與關(guān)閉及文件的讀寫方法。文件的打開與關(guān)閉及文件的讀寫方法。 對語法點要加以記對語法點要加以記憶并多上機(jī)練習(xí)。憶并多上機(jī)練習(xí)。目目 錄錄10.110.1 文件概述文件概述10.210.2 文件

2、的打開與關(guān)閉文件的打開與關(guān)閉10.310.3 文件的讀寫操作文件的讀寫操作返返 回回上一頁上一頁10.510.5 文件應(yīng)用舉例文件應(yīng)用舉例 10.410.4 文件定位文件定位 10.610.6 本章小結(jié)本章小結(jié) 10.1 文件概述文件概述下一頁下一頁返返 回回 1文件的概念文件的概念 文件是程序設(shè)計中一個重要的概念。所謂文件,是指存儲在外部介質(zhì)文件是程序設(shè)計中一個重要的概念。所謂文件,是指存儲在外部介質(zhì)上數(shù)據(jù)的集合。數(shù)據(jù)是以文件的形式存放在外部介質(zhì)上(如磁盤);計算機(jī)上數(shù)據(jù)的集合。數(shù)據(jù)是以文件的形式存放在外部介質(zhì)上(如磁盤);計算機(jī)操作系統(tǒng)是以文件為單位對數(shù)據(jù)進(jìn)行管理。也就是說,如果想找存在外

3、部介操作系統(tǒng)是以文件為單位對數(shù)據(jù)進(jìn)行管理。也就是說,如果想找存在外部介質(zhì)上的數(shù)據(jù),必須先按文件名找到所指定的文件,然后再從該文件中讀取數(shù)質(zhì)上的數(shù)據(jù),必須先按文件名找到所指定的文件,然后再從該文件中讀取數(shù)據(jù)。要向外部介質(zhì)上存儲數(shù)據(jù)也必須先建立一個文件(以文件名標(biāo)識),才據(jù)。要向外部介質(zhì)上存儲數(shù)據(jù)也必須先建立一個文件(以文件名標(biāo)識),才能向它寫數(shù)據(jù)。能向它寫數(shù)據(jù)。 2文件的類型文件的類型 從不同的角度可以將文件劃分成不同的類型。從不同的角度可以將文件劃分成不同的類型。 (1)按文件存儲內(nèi)容,文件可分為源程序文件和數(shù)據(jù)文件。)按文件存儲內(nèi)容,文件可分為源程序文件和數(shù)據(jù)文件。源程序文件存放的是程序代碼

4、,數(shù)據(jù)文件是程序中的數(shù)據(jù)的集合。本書中前源程序文件存放的是程序代碼,數(shù)據(jù)文件是程序中的數(shù)據(jù)的集合。本書中前面章節(jié)中講述的文件均為源程序文件,本章所介紹的文件多為數(shù)據(jù)文件。面章節(jié)中講述的文件均為源程序文件,本章所介紹的文件多為數(shù)據(jù)文件。 (2)按文件存取方式,文件可分為順序文件和隨機(jī)文件。)按文件存取方式,文件可分為順序文件和隨機(jī)文件。 順序文件顧名思義總是從文件的開頭順序讀或者寫,也就是按文件的順序文件顧名思義總是從文件的開頭順序讀或者寫,也就是按文件的字節(jié)順序進(jìn)行,而隨機(jī)文件可以指定讀寫位置,并對該位置上的數(shù)據(jù)直接進(jìn)字節(jié)順序進(jìn)行,而隨機(jī)文件可以指定讀寫位置,并對該位置上的數(shù)據(jù)直接進(jìn)行讀寫操作

5、。行讀寫操作。 (3)按文件的數(shù)據(jù)組織方式,文件可分為文本文件和二進(jìn)制文件。)按文件的數(shù)據(jù)組織方式,文件可分為文本文件和二進(jìn)制文件。 文本文件(也稱文本文件(也稱ACSII文件)是指文件中的字符以其文件)是指文件中的字符以其ASCII碼的形式存儲碼的形式存儲在文件中,文件中的每個字符占在文件中,文件中的每個字符占1個字節(jié)。如整型數(shù)據(jù)個字節(jié)。如整型數(shù)據(jù)12345在內(nèi)存中占在內(nèi)存中占4個字個字節(jié),而如果以文本文件形式存儲則占節(jié),而如果以文本文件形式存儲則占5個字節(jié)。所以文本文件中的數(shù)據(jù)讀入內(nèi)個字節(jié)。所以文本文件中的數(shù)據(jù)讀入內(nèi)存處理時,需要將其從文件中數(shù)據(jù)的存儲形式轉(zhuǎn)換為內(nèi)存中的存儲形式。存處理時,

6、需要將其從文件中數(shù)據(jù)的存儲形式轉(zhuǎn)換為內(nèi)存中的存儲形式。 二進(jìn)制文件是指數(shù)據(jù)以其在內(nèi)存中的存放形式存儲到文件中。整型數(shù)據(jù)在二進(jìn)制文件是指數(shù)據(jù)以其在內(nèi)存中的存放形式存儲到文件中。整型數(shù)據(jù)在內(nèi)存中占內(nèi)存中占4個字節(jié),如果將整型數(shù)據(jù)存儲到二進(jìn)制文件中,該數(shù)據(jù)還占個字節(jié),如果將整型數(shù)據(jù)存儲到二進(jìn)制文件中,該數(shù)據(jù)還占4個字節(jié)。個字節(jié)。所以將二進(jìn)制文件中的數(shù)據(jù)讀入內(nèi)存處理時,不需要中間轉(zhuǎn)換。由此可見,二所以將二進(jìn)制文件中的數(shù)據(jù)讀入內(nèi)存處理時,不需要中間轉(zhuǎn)換。由此可見,二進(jìn)制文件節(jié)省存儲空間而存取速度比文本文件的存取速度快。進(jìn)制文件節(jié)省存儲空間而存取速度比文本文件的存取速度快。 3.文件指針文件指針 在對文件

7、進(jìn)行打開、讀寫及關(guān)閉操作時,需要借助文件指針來完成。在對文件進(jìn)行打開、讀寫及關(guān)閉操作時,需要借助文件指針來完成。 文件指針是指向結(jié)構(gòu)體類型的指針,該結(jié)構(gòu)體類型由系統(tǒng)定義,取名文件指針是指向結(jié)構(gòu)體類型的指針,該結(jié)構(gòu)體類型由系統(tǒng)定義,取名FILE,其中存放著文件的名字、文件狀態(tài)、文件大小以及文件位置等信息。程,其中存放著文件的名字、文件狀態(tài)、文件大小以及文件位置等信息。程序中可以用序中可以用FILE類型定義指針變量,以指向文件,定義的一般形式為:類型定義指針變量,以指向文件,定義的一般形式為: FILE *指針變量;指針變量; 例如:例如:FILE *fp; fp是指向是指向FILE結(jié)構(gòu)體類型的變

8、量,該變量可以用來存放某個文件信息,結(jié)構(gòu)體類型的變量,該變量可以用來存放某個文件信息,因此稱文件指針。文件的訪問必須通過文件的指針來完成,定義文件指針時必因此稱文件指針。文件的訪問必須通過文件的指針來完成,定義文件指針時必須包含頭文件須包含頭文件“stdio.h。 上一頁上一頁下一頁下一頁返返 回回上一頁上一頁下一頁下一頁返返 回回文件打開操作使用庫函數(shù)文件打開操作使用庫函數(shù)fopen( )來完成。來完成。fopen( )函數(shù)調(diào)用的一般形式:函數(shù)調(diào)用的一般形式:文件指針文件指針=fopen(文件名,文件使用方式);(文件名,文件使用方式);若打開成功,該函數(shù)返回一個指向若打開成功,該函數(shù)返回一

9、個指向FILE類型的指針;否則返回類型的指針;否則返回0(NULL)。)。如:如:FILE *fp;fp=fopen(filename,r); /* 以讀方式打開以讀方式打開“filename”文件,并使文件,并使fp指向指向該文件該文件 */為了確保能正確使用被打開的文件,一般采用以下程序段來打開文件:為了確保能正確使用被打開的文件,一般采用以下程序段來打開文件:if(fp=fopen(filename,mode)= =NULL) /*打開打開filename文件,文件,mode是使用方式是使用方式*/ printf(Can not open this file!n); exit(0); /

10、* 打開文件不成功,強(qiáng)制退出程序打開文件不成功,強(qiáng)制退出程序 */文件名是一個合法的字符串。文件名是一個合法的字符串。文件使用方式為讀或?qū)懀S玫奈募褂梅绞饺绫砦募褂梅绞綖樽x或?qū)?,常用的文件使用方式如?0.1所示。所示。10.2 文件的打開與關(guān)閉文件的打開與關(guān)閉10.2.1 文件的打開文件的打開上一頁上一頁下一頁下一頁返返 回回使用方式使用方式含含 義義文本文文本文件件二進(jìn)制文二進(jìn)制文件件rrb讀方式。要求打開的文件必須存在讀方式。要求打開的文件必須存在wwb寫方式。新建一個文件,不論該打開的文件是否存在寫方式。新建一個文件,不論該打開的文件是否存在aab追加方式。(追加方式。(1)若打

11、開的文件存在,則從文件尾追加數(shù)據(jù),原有內(nèi)容保留)若打開的文件存在,則從文件尾追加數(shù)據(jù),原有內(nèi)容保留(2)若打開的文件不存在,則建立該文件)若打開的文件不存在,則建立該文件r+rb+讀寫方式。要求打開的文件必須存在,且可讀可寫讀寫方式。要求打開的文件必須存在,且可讀可寫(1)r+:從起始位置開始讀寫,寫數(shù)據(jù)時,只覆蓋占用空間,其它不變:從起始位置開始讀寫,寫數(shù)據(jù)時,只覆蓋占用空間,其它不變(2)rb+:可以由指定位置開始讀寫,其它與文本文件相同:可以由指定位置開始讀寫,其它與文本文件相同w+wb+讀寫方式。首先建立新文件,進(jìn)行寫操作,隨后再讀。若文件存在,則原讀寫方式。首先建立新文件,進(jìn)行寫操作

12、,隨后再讀。若文件存在,則原內(nèi)容消失內(nèi)容消失(1)w+:從起始位置開始讀:從起始位置開始讀 (2)wb+:可以由指定位置開始讀:可以由指定位置開始讀a+ab+追加讀寫方式。與追加讀寫方式。與“a”和和 “ab”相同,但追加數(shù)據(jù)后,可以從頭讀相同,但追加數(shù)據(jù)后,可以從頭讀(“a+”),或從指定位置開始讀(),或從指定位置開始讀(“ab+”)表表10.1 文件的使用方式文件的使用方式 在使用完一個文件后應(yīng)該關(guān)閉它,以防止它再被誤用。在使用完一個文件后應(yīng)該關(guān)閉它,以防止它再被誤用?!瓣P(guān)閉關(guān)閉”就是就是使文件指針變量不指向該文件,也就是文件指針變量與文件使文件指針變量不指向該文件,也就是文件指針變量與

13、文件“脫鉤脫鉤”,以后,以后不能再通過該指針對原來與其相聯(lián)系的文件進(jìn)行讀寫操作。除非再次打開,不能再通過該指針對原來與其相聯(lián)系的文件進(jìn)行讀寫操作。除非再次打開,使該指針變量重新指向該文件。使該指針變量重新指向該文件。 用用fclose函數(shù)關(guān)閉文件。函數(shù)關(guān)閉文件。fclose函數(shù)調(diào)用的一般形式為:函數(shù)調(diào)用的一般形式為: fclose(文件指針)(文件指針); 例如:例如: fclose(fp); 前面我們曾把打開文件(用前面我們曾把打開文件(用fopen函數(shù))時所帶回的指針賦給了函數(shù))時所帶回的指針賦給了fp,今,今通過通過fp把該文件關(guān)閉。即把該文件關(guān)閉。即fp不再指向該文件。不再指向該文件。

14、應(yīng)該養(yǎng)成在程序終止之前關(guān)閉所有文件的習(xí)慣,如果不關(guān)閉文件將會丟失數(shù)應(yīng)該養(yǎng)成在程序終止之前關(guān)閉所有文件的習(xí)慣,如果不關(guān)閉文件將會丟失數(shù)據(jù)。據(jù)。 fclose函數(shù)也帶回一個值,當(dāng)順利地執(zhí)行了關(guān)閉操作,則返回值為函數(shù)也帶回一個值,當(dāng)順利地執(zhí)行了關(guān)閉操作,則返回值為0;否則返回否則返回EOF(-1)。)。上一頁上一頁下一頁下一頁返返 回回10.2.2 文件的關(guān)閉文件的關(guān)閉上一頁上一頁下一頁下一頁返返 回回 1字符寫函數(shù)字符寫函數(shù)(fputc( )或或putc( )一般調(diào)用形式為:一般調(diào)用形式為:fputc(ch,fp);其中其中ch是要輸出的字符,它可以是一個字符常量,也可以是一個字符變量。是要輸出的

15、字符,它可以是一個字符常量,也可以是一個字符變量。fp是文件指針。是文件指針。fputc(ch,fp)函數(shù)的作用是將字符函數(shù)的作用是將字符ch的值輸出到的值輸出到fp所指向的所指向的文件中去。文件中去。2字符讀函數(shù)字符讀函數(shù)(fgetc( )或或getc( )一般調(diào)用形式為:一般調(diào)用形式為:ch=fgetc(fp);fp為文件指針,為文件指針,ch為字符變量。為字符變量。 fgetc函數(shù)帶回一個字符,賦給函數(shù)帶回一個字符,賦給ch。3文件結(jié)束標(biāo)志文件結(jié)束標(biāo)志(1)EOF。EOF是在是在stdio.h文件中定義的符號常量,值為文件中定義的符號常量,值為-1。是文本文件。是文本文件的結(jié)束標(biāo)志。的結(jié)

16、束標(biāo)志。如果在執(zhí)行如果在執(zhí)行fgetc函數(shù)讀字符時遇到文件結(jié)束符,函數(shù)返回一個文件結(jié)束標(biāo)函數(shù)讀字符時遇到文件結(jié)束符,函數(shù)返回一個文件結(jié)束標(biāo)志志EOF。10.3 文件的讀寫操作文件的讀寫操作10.3.1 字符的讀寫操作字符的讀寫操作(2)feof(fp)。對于二進(jìn)制文件可以用)。對于二進(jìn)制文件可以用feof(fp)函數(shù)來測試)函數(shù)來測試fp所指向的所指向的文件當(dāng)前狀態(tài)是否文件當(dāng)前狀態(tài)是否“文件結(jié)束文件結(jié)束”。如果是文件結(jié)束,函數(shù)。如果是文件結(jié)束,函數(shù)feof(fp)的值為)的值為1(真),否則為(真),否則為0(假)。這個函數(shù)也適用于文本文件。(假)。這個函數(shù)也適用于文本文件。【例【例10.1】

17、 從鍵盤輸入一些字符,逐個把它們存入文件中,直到輸入一個從鍵盤輸入一些字符,逐個把它們存入文件中,直到輸入一個“#”為止。為止。【編程思路【編程思路】(1)定義一個字符型數(shù)組,用來存放文件名,再定義一個字符型變量,用來)定義一個字符型數(shù)組,用來存放文件名,再定義一個字符型變量,用來接收從鍵盤輸入的字符。接收從鍵盤輸入的字符。(2)定義一個文件類型指針,使其和打開的文件相關(guān)聯(lián)。打開方式為)定義一個文件類型指針,使其和打開的文件相關(guān)聯(lián)。打開方式為w。(3)通過循環(huán)建立文件,即把輸入的字符逐個寫入文件中。)通過循環(huán)建立文件,即把輸入的字符逐個寫入文件中。上一頁上一頁下一頁下一頁返返 回回【程序代碼【

18、程序代碼】#includemain( ) FILE *fp; char ch,filename10; scanf(%s,filename); if(fp=fopen(filename,w)= =NULL) printf(“can not open filen); exit(0); ch=getchar( ); /*接收輸入的第一個字符接收輸入的第一個字符*/ while (ch!=#) fputc(ch,fp);putchar(ch); ch=getchar( ); fclose(fp);運行結(jié)果如下:運行結(jié)果如下:上一頁上一頁下一頁下一頁返返 回回【例【例10.2】 將一個磁盤文件中的信息復(fù)

19、制到另一個磁盤文件中。將一個磁盤文件中的信息復(fù)制到另一個磁盤文件中?!揪幊趟悸贰揪幊趟悸贰浚?)定義兩個文件類型指針,分別和源文件及目標(biāo)文件關(guān)聯(lián),打開這兩個文)定義兩個文件類型指針,分別和源文件及目標(biāo)文件關(guān)聯(lián),打開這兩個文件時分別使用件時分別使用r和和w方式。方式。(2)從通過循環(huán)不斷從源文件讀字符并寫入目標(biāo)文件,循環(huán)條件是源文件沒)從通過循環(huán)不斷從源文件讀字符并寫入目標(biāo)文件,循環(huán)條件是源文件沒有結(jié)束。有結(jié)束?!境绦虼a【程序代碼】#includemain( ) FILE *in,*out;char infile10,outfile10;printf(Enter the infile name

20、: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) fputc(fgetc(in),out);fclose(in);fclose(out);運行結(jié)果如下:運行結(jié)果如下:上一

21、頁上一頁下一頁下一頁返返 回回1字符串寫函數(shù)字符串寫函數(shù)(fputs( )fputs函數(shù)用來把字符串輸出到文件中,一般調(diào)用形式為:函數(shù)用來把字符串輸出到文件中,一般調(diào)用形式為:fputs(str,fp);此處,此處,fp是文件指針,是文件指針,str是待輸出字符串,可以是字符串常量、字符數(shù)組是待輸出字符串,可以是字符串常量、字符數(shù)組名或字符型指針。用此函數(shù)進(jìn)行輸出時,字符串中最后的名或字符型指針。用此函數(shù)進(jìn)行輸出時,字符串中最后的0并不輸出,也并不輸出,也不自動加不自動加n。2.字符串讀函數(shù)字符串讀函數(shù)(fgets( )fgets的作用是從指定文件讀入一個字符串。一般調(diào)用形式為:的作用是從指定

22、文件讀入一個字符串。一般調(diào)用形式為:fgets(str,n,fp);此處,此處,fp為文件指針,為文件指針,str是存放字符串的起始地址,是存放字符串的起始地址,n為要求得到字符數(shù)為要求得到字符數(shù)量,是一個整型變量。函數(shù)的功能是從量,是一個整型變量。函數(shù)的功能是從fp指向的文件中讀指向的文件中讀n-1個字符放入個字符放入str為起始地址的存儲單元中,然后系統(tǒng)將在最后自動加一個為起始地址的存儲單元中,然后系統(tǒng)將在最后自動加一個0字符,如字符,如果在讀完果在讀完n-1個字符之前遇到換行符或個字符之前遇到換行符或EOF,讀入即結(jié)束。,讀入即結(jié)束。fgets函數(shù)返回函數(shù)返回值為值為str的首地址。的首

23、地址。上一頁上一頁下一頁下一頁返返 回回10.3.2 字符串讀寫操作字符串讀寫操作【例【例10.3】 編寫程序,從鍵盤輸入三行字符,并存入文件編寫程序,從鍵盤輸入三行字符,并存入文件ss.txt中,再將中,再將ss.txt中的內(nèi)容讀出來顯示在屏幕上。中的內(nèi)容讀出來顯示在屏幕上?!境绦虼a【程序代碼】#include main( )int i; char str81;FILE *fp; fp=fopen(ss.txt,w); if (fp=NULL) puts(無法打開文件!無法打開文件!n); exit(0); puts(please input the string :n);for(i=0;

24、i3;i+) gets(str); 上一頁上一頁下一頁下一頁返返 回回fputs(str,fp); fputs(n,fp); fclose(fp); puts(content of the file is:n);if (fp=fopen(ss.txt,r)=NULL) printf(無法打開文件!無法打開文件!n);exit(0); while(fgets(str,81,fp)!=NULL)printf(%s,str);fclose(fp); 運行結(jié)果如下:運行結(jié)果如下:上一頁上一頁下一頁下一頁返返 回回10.3.3 數(shù)據(jù)塊讀寫操作數(shù)據(jù)塊讀寫操作二進(jìn)制文件存儲信息的形式與內(nèi)存中存儲信息的形式是

25、一致的,如果需要二進(jìn)制文件存儲信息的形式與內(nèi)存中存儲信息的形式是一致的,如果需要在內(nèi)存與磁盤文件之間頻繁交換數(shù)據(jù),最好采用二進(jìn)制文件。在內(nèi)存與磁盤文件之間頻繁交換數(shù)據(jù),最好采用二進(jìn)制文件。二進(jìn)制文件一般是同類型數(shù)據(jù)的集合,每個數(shù)據(jù)所占字節(jié)數(shù)是一個固定值,二進(jìn)制文件一般是同類型數(shù)據(jù)的集合,每個數(shù)據(jù)所占字節(jié)數(shù)是一個固定值,因此二進(jìn)制文件除了可以順序存取外,還可以運用定位函數(shù)方便地進(jìn)行隨因此二進(jìn)制文件除了可以順序存取外,還可以運用定位函數(shù)方便地進(jìn)行隨機(jī)存取。機(jī)存取。 二進(jìn)制文件的讀寫操作可用數(shù)據(jù)塊讀寫函數(shù)二進(jìn)制文件的讀寫操作可用數(shù)據(jù)塊讀寫函數(shù)fwrite( )和和fread( )完成。完成。1.塊寫

26、函數(shù)塊寫函數(shù)(fwrite( )fwrite( )函數(shù)的作用是把一組數(shù)據(jù)輸出到指定的磁盤文件中。一般調(diào)用形式為:函數(shù)的作用是把一組數(shù)據(jù)輸出到指定的磁盤文件中。一般調(diào)用形式為:fwrite(buffer,size,count,fp);其中,其中,buffer為一個指針,為要輸出數(shù)據(jù)的首地址,為一個指針,為要輸出數(shù)據(jù)的首地址,size為要寫數(shù)據(jù)塊的字為要寫數(shù)據(jù)塊的字節(jié)數(shù),節(jié)數(shù),count為要寫數(shù)據(jù)塊的個數(shù),為要寫數(shù)據(jù)塊的個數(shù),fp為文件類型指針。例如:為文件類型指針。例如:fwrite(fa,4,5,fp);其作用是將其作用是將fa指向的存儲區(qū)中指向的存儲區(qū)中5個個4B(即(即1個整型數(shù)據(jù)或單精度

27、實型數(shù)據(jù))大個整型數(shù)據(jù)或單精度實型數(shù)據(jù))大小的數(shù)據(jù)項寫入小的數(shù)據(jù)項寫入fp所指向的文件中。所指向的文件中。2.塊讀函數(shù)塊讀函數(shù)(fread( ) )fread( )函數(shù)的作用是從指定的磁盤文件中讀取一組數(shù)據(jù),并存放到指定的存函數(shù)的作用是從指定的磁盤文件中讀取一組數(shù)據(jù),并存放到指定的存儲區(qū)域。一般調(diào)用形式為:儲區(qū)域。一般調(diào)用形式為:fread(buffer,size,count,fp);其中,其中,buffer為一個指針,是讀入數(shù)據(jù)的存放地址,為一個指針,是讀入數(shù)據(jù)的存放地址, size為要讀數(shù)據(jù)塊的字為要讀數(shù)據(jù)塊的字節(jié)數(shù),節(jié)數(shù),count為要讀數(shù)據(jù)塊的個數(shù),為要讀數(shù)據(jù)塊的個數(shù),fp為文件類型指

28、針。例如:為文件類型指針。例如:fread(fa,4,5,fp);其作用是從其作用是從fp所指文件中,讀取所指文件中,讀取5個個4B大小的數(shù)據(jù),存入大小的數(shù)據(jù),存入fa所指存儲區(qū)中。所指存儲區(qū)中。上一頁上一頁下一頁下一頁返返 回回【例【例10.4】 從鍵盤輸入兩個學(xué)生信息(包括姓名、編號、年齡及地址),從鍵盤輸入兩個學(xué)生信息(包括姓名、編號、年齡及地址),存入一個二進(jìn)制文件中,然后再讀出這兩個學(xué)生的信息顯示在屏幕上。存入一個二進(jìn)制文件中,然后再讀出這兩個學(xué)生的信息顯示在屏幕上?!境绦虼a【程序代碼】#includestruct stu char name10;int num;int age;c

29、har addr15;boya2,boyb2,*pp,*qq; main()FILE *fp;int i;pp=boya;qq=boyb;if(fp=fopen(stu_list,wb+)=NULL)printf(文件不能打開文件不能打開!);exit(0);上一頁上一頁下一頁下一頁返返 回回printf(n請輸入兩個學(xué)生信息:請輸入兩個學(xué)生信息:n);for(i=0;iname,&pp-num,&pp-age,pp-addr);pp=boya; fwrite(pp,sizeof(struct stu),2,fp); rewind(fp);fread(qq,sizeof(str

30、uct stu),2,fp); printf(-n);printf(nn姓名姓名t編號編號 年齡年齡 地址地址n);for(i=0;iname,qq-num,qq-age,qq-addr);fclose(fp);運行結(jié)果如下:運行結(jié)果如下:上一頁上一頁下一頁下一頁返返 回回fscanf( ) 和和fprintf( )函數(shù)是格式化讀寫函數(shù),其讀寫對象是磁盤文件,格函數(shù)是格式化讀寫函數(shù),其讀寫對象是磁盤文件,格式化讀寫函數(shù)只適用于文本文件,不適用于二進(jìn)制文件。式化讀寫函數(shù)只適用于文本文件,不適用于二進(jìn)制文件。 fscanf( )和和fprintf( ) 函數(shù)與函數(shù)與scanf( ) 和和print

31、f( )函數(shù)的格式控制部分相同。函數(shù)的格式控制部分相同。1格式化寫函數(shù)格式化寫函數(shù)(fprintf( )fprintf( )函數(shù)的作用是將函數(shù)的作用是將“輸出表列輸出表列”中所指出的變量中數(shù)據(jù)經(jīng)過轉(zhuǎn)換后中所指出的變量中數(shù)據(jù)經(jīng)過轉(zhuǎn)換后寫到文件中去。該函數(shù)的一般格式是:寫到文件中去。該函數(shù)的一般格式是:fprintf(文件類型指針文件類型指針, 格式控制字符串格式控制字符串,輸出表列,輸出表列);例如:例如:fprintf(fp,%d,%6.2f,i,t);它的作用是將整形變量它的作用是將整形變量i和實型變量和實型變量t的值按的值按%d和和%6.2f的格式輸出到的格式輸出到fp指指向的文件上。如果

32、向的文件上。如果i=3,t=4.5則輸出到磁盤文件上的是以下的內(nèi)容:則輸出到磁盤文件上的是以下的內(nèi)容:3,4.50上一頁上一頁下一頁下一頁返返 回回10.3.4 格式化讀寫操作格式化讀寫操作上一頁上一頁下一頁下一頁返返 回回2.格式化讀函數(shù)格式化讀函數(shù)(fscanf( )fscanf( )函數(shù)的作用是從文件中將數(shù)據(jù)按指定格式讀到有關(guān)地址內(nèi)存存儲區(qū)。函數(shù)的作用是從文件中將數(shù)據(jù)按指定格式讀到有關(guān)地址內(nèi)存存儲區(qū)。該函數(shù)的一般格式是:該函數(shù)的一般格式是:fscanf(文件類型指針文件類型指針, 格式控制字符串格式控制字符串,地址表列,地址表列);例如:例如:fscanf(fp,%d,%f,&i

33、,&t);磁盤文件上如果有以下字符:磁盤文件上如果有以下字符:3,4.500000則將磁盤文件中的數(shù)據(jù)則將磁盤文件中的數(shù)據(jù)3送給變量送給變量i,4.5送給變量送給變量t?!纠纠?0.5】 把兩個整數(shù)寫入文件中,再從文件中讀出來并求和,輸出此和把兩個整數(shù)寫入文件中,再從文件中讀出來并求和,輸出此和值。值?!境绦虼a【程序代碼】#include main( )int a,b,c,d,s=0; FILE *fp; fp=fopen(file1.dat,w+); scanf(%d%d,&a,&b);fprintf(fp, %d %d,a,b); rewind(fp);fsca

34、nf(fp, %d%d,&c,&d); s=c+d; printf(s=%dn,s); fclose(fp); 運行結(jié)果如下:運行結(jié)果如下:文件中的讀寫位置指針,在讀寫一個文件時,每次執(zhí)行一個讀寫操作后,將文件中的讀寫位置指針,在讀寫一個文件時,每次執(zhí)行一個讀寫操作后,將自動移動到下一個待讀寫的位置。如果想改變這樣的規(guī)律,強(qiáng)制使位置指針自動移動到下一個待讀寫的位置。如果想改變這樣的規(guī)律,強(qiáng)制使位置指針指向某一指定的位置,可以使用下面一些相關(guān)函數(shù)。指向某一指定的位置,可以使用下面一些相關(guān)函數(shù)。1移動文件位置指針函數(shù)移動文件位置指針函數(shù)(fseek( )fseek( )函數(shù)調(diào)用的一

35、般形式:函數(shù)調(diào)用的一般形式:fseek(fp,offset,origin);功能:將文件的位置指針從某處移動到指定的位置,接著的讀寫操作即從該功能:將文件的位置指針從某處移動到指定的位置,接著的讀寫操作即從該位置開始。位置開始。說明:說明:(1)fp是待操作的文件指針;是待操作的文件指針;(2)offset是以字節(jié)為單位的位移量,為是以字節(jié)為單位的位移量,為long型,當(dāng)型,當(dāng)offset0時,位置指針時,位置指針向文件尾方向移動,當(dāng)向文件尾方向移動,當(dāng)offset0,位置指針向文件首方向移動;,位置指針向文件首方向移動;(3)origin是位置指針移動的起始點,它可以用數(shù)字表示,也可用符號常

36、量是位置指針移動的起始點,它可以用數(shù)字表示,也可用符號常量表示,取值如下:表示,取值如下:文件開始文件開始 0 或或 SEEK_SET文件當(dāng)前位置文件當(dāng)前位置 1 或或 SEEK_CUR文件末尾文件末尾 2 或或 SEEK_END上一頁上一頁下一頁下一頁返返 回回10.4 文件定位文件定位上一頁上一頁下一頁下一頁返返 回回(4)fseek函數(shù)一般用于二進(jìn)制文件,因為文本文件要發(fā)生字符轉(zhuǎn)換,計函數(shù)一般用于二進(jìn)制文件,因為文本文件要發(fā)生字符轉(zhuǎn)換,計算位置時往往會發(fā)生混亂。算位置時往往會發(fā)生混亂。如:如:fseek(fp,20L,SEEK_SET); /*文件位置指針從文件首部向后移動文件位置指針從

37、文件首部向后移動20個字節(jié)個字節(jié)*/fseek(fp,-30L,SEEK_END); /*文件位置指針從文件尾向前移動文件位置指針從文件尾向前移動30個字節(jié)個字節(jié)*/2獲取文件位置指針值函數(shù)獲取文件位置指針值函數(shù)(ftell( )ftell( )函數(shù)調(diào)用的一般形式:函數(shù)調(diào)用的一般形式:t=ftell(fp);功能:獲取功能:獲取fp所指文件的位置指針值,即距文件首的字節(jié)數(shù),它是所指文件的位置指針值,即距文件首的字節(jié)數(shù),它是long型型數(shù)據(jù)。數(shù)據(jù)。說明:說明:fp是待操作的文件指針;是待操作的文件指針;t是是long型變量,用來存放型變量,用來存放ftell函數(shù)的返回函數(shù)的返回值,當(dāng)函數(shù)調(diào)用成功

38、時,返回位置值,失敗時,返回值,當(dāng)函數(shù)調(diào)用成功時,返回位置值,失敗時,返回-1L。如:測試文件長度如:測試文件長度fseek(fp,0L,SEEK_END); /*將位置指針移到文件尾將位置指針移到文件尾*/t=ftell(fp); /*獲取文件長度(字節(jié)數(shù))獲取文件長度(字節(jié)數(shù))*/上一頁上一頁下一頁下一頁返返 回回3文件位置指針返回文件首函數(shù)文件位置指針返回文件首函數(shù)(rewind( )rewind( )函數(shù)調(diào)用的一般形式:函數(shù)調(diào)用的一般形式:rewind(fp);功能:使功能:使fp所指文件的位置指針返回到文件首部。所指文件的位置指針返回到文件首部。說明:說明:fp是待操作的文件指針;該

39、函數(shù)沒有返回值。又稱是待操作的文件指針;該函數(shù)沒有返回值。又稱“返繞返繞”函數(shù)。函數(shù)?!纠纠?0.6】 向文件中存入向文件中存入5個學(xué)生的數(shù)據(jù)(包括姓名、學(xué)號、年齡)。然后個學(xué)生的數(shù)據(jù)(包括姓名、學(xué)號、年齡)。然后從文件中讀出第從文件中讀出第1、3、5個學(xué)生的數(shù)據(jù),并在屏幕上顯示出來。個學(xué)生的數(shù)據(jù),并在屏幕上顯示出來?!境绦虼a【程序代碼】#includestruct student_type char name10; int num; int age; stu5;上一頁上一頁下一頁下一頁返返 回回main( ) int i; FILE *fp; if(fp=fopen(stud_dat,w

40、b+)=NULL) printf(can not open filen); exit(0); for(i=0;i5;i+) scanf(%s%d%d,,&stui.num,&stui.age); fwrite(&stui,sizeof(struct student_type),1,fp); rewind(fp); printf(-n); for(i=0;i5;i+=2) fseek(fp,i*sizeof(struct student_type),0); fread(&stui,sizeof(struct student_type),1,fp)

41、; printf(%s%t%dt%dn,,stui.num,stui.age);fclose(fp);上一頁上一頁下一頁下一頁返返 回回運行結(jié)果如下:運行結(jié)果如下:10.5 文件應(yīng)用舉例文件應(yīng)用舉例【例【例10.7】從鍵盤輸入】從鍵盤輸入5個整數(shù)到二進(jìn)制文件中,然后修改文件中的第個整數(shù)到二進(jìn)制文件中,然后修改文件中的第3個個數(shù)為原來的數(shù)為原來的4倍,并保存到文件中,輸出修改后文件的內(nèi)容。倍,并保存到文件中,輸出修改后文件的內(nèi)容?!揪幊趟悸贰揪幊趟悸贰浚?)定義四個函數(shù),分別用來寫數(shù)據(jù)、讀數(shù)據(jù)和修改數(shù)據(jù),主函數(shù)調(diào)用)定義四個函數(shù),分別用來寫數(shù)據(jù)、讀數(shù)據(jù)和修改數(shù)據(jù),主函數(shù)調(diào)用這些

42、函數(shù)。這些函數(shù)。(2)修改函數(shù)中,通過定位函數(shù))修改函數(shù)中,通過定位函數(shù)fseek(),使文件位置指針指向要修改的,使文件位置指針指向要修改的數(shù)據(jù),讀出后確認(rèn)需修改,則重新輸入要修改的數(shù)據(jù),再寫回文件即可。數(shù)據(jù),讀出后確認(rèn)需修改,則重新輸入要修改的數(shù)據(jù),再寫回文件即可。上一頁上一頁下一頁下一頁返返 回回【程序代碼【程序代碼】#include stdio.h#define N 5void mywrite(int *p);void myread(int *p);void mymodify( );main()int i,numN;printf(n請輸入請輸入5個數(shù)據(jù)個數(shù)據(jù): );for(i=0;iN

43、;i+)scanf(%d,&numi); mywrite(num);printf(n文件中的原始數(shù)據(jù)為文件中的原始數(shù)據(jù)為:n);myread(num);mymodify(); printf(n修改后的文件數(shù)據(jù)為修改后的文件數(shù)據(jù)為:n);myread(num);void mywrite(int *p) FILE *fp;int *q;fp=fopen(list,wb);for(q=p;qp+N;q+) fwrite(q,4,1,fp);fclose(fp);void myread(int *p) FILE *fp;int *q;fp=fopen(list,rb);for(q=p;qp+N

44、;q+) fread(q,4,1,fp);printf(%3d,*q);printf(nn);fclose(fp);上一頁上一頁下一頁下一頁返返 回回void mymodify( ) FILE *fp;int a=0;fp=fopen(list,rb+);fseek(fp,2*4,SEEK_SET); /*定位到第定位到第3個數(shù)的位置個數(shù)的位置*/fread(&a,4,1,fp); printf(n第第3個數(shù)是個數(shù)是: %dn,a);a*=4;fseek(fp,-4,SEEK_CUR); /*重新定位到第重新定位到第3個數(shù)的位置個數(shù)的位置*/fwrite(&a,4,1,fp);

45、 /*將數(shù)據(jù)寫入文件將數(shù)據(jù)寫入文件*/fclose(fp);運行結(jié)果如下:運行結(jié)果如下: 上一頁上一頁下一頁下一頁返返 回回【例【例10.8】 有有N個學(xué)生,每個學(xué)生有個學(xué)生,每個學(xué)生有3門課的成績,從鍵盤輸入學(xué)生數(shù)據(jù)門課的成績,從鍵盤輸入學(xué)生數(shù)據(jù)(包包括學(xué)號、姓名、括學(xué)號、姓名、3門課成績門課成績),計算出平均成績,并把學(xué)生的所有數(shù)據(jù)存放在磁,計算出平均成績,并把學(xué)生的所有數(shù)據(jù)存放在磁盤文件盤文件stud中。并顯示文件中的信息。中。并顯示文件中的信息?!揪幊趟悸贰揪幊趟悸贰浚?)定義一個結(jié)構(gòu)體類型,包括學(xué)號、姓名和用來存放學(xué)生成績的數(shù)組,存)定義一個結(jié)構(gòu)體類型,包括學(xué)號、姓名和用來存放學(xué)生成

46、績的數(shù)組,存放均值的成員。再定義兩個該結(jié)構(gòu)體類型的數(shù)組。一個數(shù)組用來存放原始數(shù)放均值的成員。再定義兩個該結(jié)構(gòu)體類型的數(shù)組。一個數(shù)組用來存放原始數(shù)據(jù)及均值,并將此數(shù)組中的值寫入文件中。據(jù)及均值,并將此數(shù)組中的值寫入文件中。(2)從文件中讀數(shù)據(jù)到另一個數(shù)組中,打印該數(shù)組。)從文件中讀數(shù)據(jù)到另一個數(shù)組中,打印該數(shù)組?!境绦虼a【程序代碼】#include stdio.h #define N 3struct student char num6;char name10; int score3; float avr; stuN,sN; 上一頁上一頁下一頁下一頁返返 回回main() int i,sum;

47、FILE *fp; for(i=0;iN;i+) printf(nplease input No.%d score:n,i+1); printf(stuNo: );scanf(%s,stui.num); printf(name: );scanf(%s,);sum=0; printf(score: ); scanf(%d%d%d,&stui.score0,&stui.score1,&stui.score2); sum+=stui.score0+stui.score1+stui.score2; stui.avr=sum/3.0; fp=fopen(stud

48、,wb); for(i=0;iN;i+) fwrite(&stui,sizeof(struct student),1,fp); fclose(fp); 上一頁上一頁下一頁下一頁返返 回回fp=fopen(stud,rb); for(i=0;iN;i+) fread(&si,sizeof(struct student),1,fp); printf(-n); printf(No.tNametScore1tScore2tScore3taveragen);for(i=0;iN;i+)printf(%st%st,si.num,);printf(%dt%dt%dt%.2fnn,si.score0,si.score1,si.score2,si.avr

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論