




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、C語言文件操作C語言文件操作3、文件、文件 文件是存儲在外部存儲介質(zhì)上的信息的集合。 每個文件有唯一的文件名(主名每個文件有唯一的文件名(主名. .后綴)來標(biāo)識。計后綴)來標(biāo)識。計算機實現(xiàn)按名對文件進(jìn)行讀、寫等有關(guān)操作。算機實現(xiàn)按名對文件進(jìn)行讀、寫等有關(guān)操作。 廣義上,操作系統(tǒng)將每一個與主機相聯(lián)的輸入輸出設(shè)備都廣義上,操作系統(tǒng)將每一個與主機相聯(lián)的輸入輸出設(shè)備都看作是文件。(顯示器、打印機是輸出文件,鍵盤是輸入文件看作是文件。(顯示器、打印機是輸出文件,鍵盤是輸入文件)。)。一、文件定義與分類一、文件定義與分類文件系統(tǒng)文件系統(tǒng) 概述概述42 2、文件的分類、文件的分類 (1 1)按存儲介質(zhì))按存
2、儲介質(zhì): : 磁盤文件、磁帶文件。磁盤文件、磁帶文件。(2 2)按文件的內(nèi)容:)按文件的內(nèi)容:( (從程序設(shè)計的角度看從程序設(shè)計的角度看) ) 源程序、目標(biāo)文件、可執(zhí)行文件、數(shù)源程序、目標(biāo)文件、可執(zhí)行文件、數(shù)據(jù)文件。據(jù)文件。(3 3)按文件的編碼方式(存儲形式)按文件的編碼方式(存儲形式): : 文本文件、二進(jìn)制文件。文本文件、二進(jìn)制文件。5二、二、數(shù)據(jù)文件的存儲形式1、字符文件(文本文件)、字符文件(文本文件):每個字符用一個每個字符用一個 ASCIIASCII碼碼 存儲(即一個字符占一個字節(jié))。存儲(即一個字符占一個字節(jié))。2、二進(jìn)制文件:以數(shù)據(jù)在內(nèi)存中的形式原樣存于磁盤。、二進(jìn)制文件:以
3、數(shù)據(jù)在內(nèi)存中的形式原樣存于磁盤。如:一個短整數(shù)(如:一個短整數(shù)(short型),型),其二進(jìn)制文件存儲方式都是占個字節(jié);其二進(jìn)制文件存儲方式都是占個字節(jié);而字符文件存儲方式所占字節(jié)數(shù)該數(shù)的數(shù)字個數(shù)。而字符文件存儲方式所占字節(jié)數(shù)該數(shù)的數(shù)字個數(shù)。int型數(shù)二進(jìn)制文件字符文件型數(shù)二進(jìn)制文件字符文件126 字節(jié)字節(jié) 字節(jié)字節(jié)1268 字節(jié)字節(jié) 字節(jié)字節(jié)6例如:例如:整數(shù)整數(shù)1268文本文件形式文本文件形式1的的ASCIIASCII碼碼00110001001100100011011000111000二進(jìn)制文件形式二進(jìn)制文件形式00000100111101001268的二進(jìn)制數(shù)的二進(jìn)制數(shù)2的的ASCIIA
4、SCII碼碼6的的ASCIIASCII碼碼8的的ASCIIASCII碼碼7三.標(biāo)準(zhǔn)文件系統(tǒng)、非標(biāo)準(zhǔn)文件系統(tǒng)程序數(shù)據(jù)區(qū)程序數(shù)據(jù)區(qū)輸出文件緩沖區(qū)輸出文件緩沖區(qū)輸入輸入輸入文件緩沖區(qū)輸入文件緩沖區(qū)輸出輸出輸入輸入磁盤磁盤內(nèi)存內(nèi)存 非標(biāo)準(zhǔn)文件系統(tǒng)非標(biāo)準(zhǔn)文件系統(tǒng):不使用緩沖區(qū)的磁盤文件系統(tǒng)不使用緩沖區(qū)的磁盤文件系統(tǒng)標(biāo)準(zhǔn)標(biāo)準(zhǔn)c 采用緩沖文件系統(tǒng),其原理圖如下:采用緩沖文件系統(tǒng),其原理圖如下:輸出輸出84.文件存取方式在在C語言中語言中,文件的存取有兩種方式:文件的存取有兩種方式:(2)隨機存?。╇S機存?。?)順序存?。╉樞虼嫒?標(biāo)準(zhǔn)文件操作標(biāo)準(zhǔn)文件操作一、一、 標(biāo)準(zhǔn)文件類型指針標(biāo)準(zhǔn)文件類型指針 每個被使用
5、的文件都在內(nèi)存中開辟一個區(qū)域每個被使用的文件都在內(nèi)存中開辟一個區(qū)域,用來存放文件的有關(guān)信息。,用來存放文件的有關(guān)信息。 這些信息是保存在一個結(jié)構(gòu)體類型的變量這些信息是保存在一個結(jié)構(gòu)體類型的變量中。該結(jié)構(gòu)體類型是由系統(tǒng)定義的,取名為中。該結(jié)構(gòu)體類型是由系統(tǒng)定義的,取名為FILEFILE。1.1.文件類型指針概述文件類型指針概述10typedef struct short level; unsigned flags; char fd; unsigned char hild; short bsize; unsigned char *buffer; unsigned istemp; short tok
6、en; FILE;FILEFILE:一個標(biāo)一個標(biāo)準(zhǔn)的標(biāo)準(zhǔn)的標(biāo)識符,識符,但不是但不是關(guān)鍵字關(guān)鍵字11 如如 FILE *fp; fp是一個指向是一個指向FILE類型結(jié)構(gòu)體的指針變量類型結(jié)構(gòu)體的指針變量,通過通過該結(jié)構(gòu)體變量中的文件信息能夠訪問該文件。該結(jié)構(gòu)體變量中的文件信息能夠訪問該文件。 如果有如果有N個文件,一般應(yīng)設(shè)個文件,一般應(yīng)設(shè)N個指針變量,使它個指針變量,使它們分別指向們分別指向N個文件(確切地說,指向該文件的信個文件(確切地說,指向該文件的信息結(jié)構(gòu)體),以實現(xiàn)對文件的訪問。息結(jié)構(gòu)體),以實現(xiàn)對文件的訪問。FILE *指針變量標(biāo)識符;指針變量標(biāo)識符;2. 文件型指針變量的定義文件型指
7、針變量的定義12標(biāo)準(zhǔn)文件操作的四個基本步驟:標(biāo)準(zhǔn)文件操作的四個基本步驟:1. 文件類型指針的定義文件類型指針的定義2. 打開標(biāo)準(zhǔn)文件打開標(biāo)準(zhǔn)文件3. 標(biāo)準(zhǔn)文件的讀或?qū)懙牟僮鳂?biāo)準(zhǔn)文件的讀或?qū)懙牟僮?. 標(biāo)準(zhǔn)文件的關(guān)閉操作標(biāo)準(zhǔn)文件的關(guān)閉操作13打開文件打開文件對文件進(jìn)行讀或?qū)憣ξ募M(jìn)行讀或?qū)戧P(guān)閉文件關(guān)閉文件文件的操作步驟文件的操作步驟文件打開函數(shù)文件打開函數(shù)文件讀寫函數(shù)文件讀寫函數(shù)文件關(guān)閉函數(shù)文件關(guān)閉函數(shù)定義文件類型指針定義文件類型指針指針定義指針定義14二二. . 標(biāo)準(zhǔn)文件的打開標(biāo)準(zhǔn)文件的打開打開文件的含義打開文件的含義 將文件信息從磁盤裝入計算機內(nèi)存將文件信息從磁盤裝入計算機內(nèi)存, ,建立文件
8、的建立文件的各種有關(guān)信息各種有關(guān)信息, ,并使文件指針指向該文件并使文件指針指向該文件, ,即建立文件即建立文件類型指針與文件名之間的關(guān)聯(lián)類型指針與文件名之間的關(guān)聯(lián). .2. .文件的打開函數(shù)文件的打開函數(shù): fopen: fopenfp=fopen(文件名,使用文件方式);文件名,使用文件方式);函數(shù)原型函數(shù)原型:FILE *fopen(char *filename,char *mode);15FILE類型指針類型指針-成功成功NULL -失敗失敗 fopen( )函數(shù)的返回值應(yīng)賦給一個函數(shù)的返回值應(yīng)賦給一個FILE指針變指針變量,量, 否則,此函數(shù)的返回值就會丟失,導(dǎo)致無法對此否則,此函數(shù)
9、的返回值就會丟失,導(dǎo)致無法對此文件進(jìn)行操作。文件進(jìn)行操作。例如:例如: FILE *fp; fp=fopen(”A1”, ”r”);以上語句表示:以上語句表示:要打開名字為要打開名字為A1的文件,使用文件的文件,使用文件的的方式為方式為“讀入讀入”,fp指向指向A1文件文件。返回值返回值:16文件打開函數(shù)的調(diào)用給編譯系統(tǒng)的三個信息:文件打開函數(shù)的調(diào)用給編譯系統(tǒng)的三個信息:1. 需要打開的文件名;需要打開的文件名;2. 使用文件的操作方式;使用文件的操作方式;3 .讓哪一個指針變量指向被打開的文件。讓哪一個指針變量指向被打開的文件。17 ”r r” (只讀)(只讀) 為輸入打開一個文本文件為輸入
10、打開一個文本文件 ”w w” (只寫)(只寫) 為輸出打開一個文本文件為輸出打開一個文本文件 ”a a” (追加)(追加) 向文本文件尾增加數(shù)據(jù)向文本文件尾增加數(shù)據(jù) ”rbrb” (只讀)(只讀) 為輸入打開一個二進(jìn)制文件為輸入打開一個二進(jìn)制文件 ”wbwb” ( (只寫)只寫) 為輸出打開一個二進(jìn)制文件為輸出打開一個二進(jìn)制文件 ”abab” (追加)(追加) 向二進(jìn)制文件尾增加數(shù)據(jù)向二進(jìn)制文件尾增加數(shù)據(jù) 3. C語言文件操作方式語言文件操作方式r: read , w: write , a: append , b:binary ,+: 讀寫讀寫18 ”r+r+” (讀寫)(讀寫) 為讀為讀/
11、/寫打開一個文本文件寫打開一個文本文件 ”w+w+” (讀寫)(讀寫) 為讀為讀/ /寫建立一個新的文本文件寫建立一個新的文本文件 ”a+a+” (讀寫)(讀寫) 為讀為讀/ /寫打開一個文本文件寫打開一個文本文件 ”rb+rb+” (讀寫)(讀寫) 為讀為讀/ /寫打開一個二進(jìn)制文件寫打開一個二進(jìn)制文件 ”wb+wb+” ( ( 讀寫)讀寫) 為讀為讀/ /寫建立一個新的二進(jìn)制文件寫建立一個新的二進(jìn)制文件 ”ab+ab+” ( ( 讀寫)讀寫) 為讀為讀/ /寫打開一個二進(jìn)制文件寫打開一個二進(jìn)制文件C語言文件操作方式語言文件操作方式(續(xù)續(xù))r: read , w: write , a: ap
12、pend , b:binary ,+: 讀寫讀寫19(1 ) 用用”r”方式打開的文件只能用于向計算機輸入數(shù)據(jù),方式打開的文件只能用于向計算機輸入數(shù)據(jù),而且該文件應(yīng)該已經(jīng)存在;而且該文件應(yīng)該已經(jīng)存在; 4. 標(biāo)準(zhǔn)文件操作方式的說明標(biāo)準(zhǔn)文件操作方式的說明(1-5)(2) 用用”w”方式打開的文件只能用于向該文件寫數(shù)據(jù),方式打開的文件只能用于向該文件寫數(shù)據(jù),而不能用來向計算機輸入。而不能用來向計算機輸入。 如果不存在該文件如果不存在該文件,則在打則在打開時建立一個。開時建立一個。 如果存在該文件如果存在該文件,則則 新寫入的數(shù)據(jù)將覆蓋新寫入的數(shù)據(jù)將覆蓋掉以前的數(shù)據(jù)。掉以前的數(shù)據(jù)。(3) 如果希望向
13、文件末尾添加新的數(shù)據(jù)(不希望刪除原有如果希望向文件末尾添加新的數(shù)據(jù)(不希望刪除原有數(shù)據(jù))數(shù)據(jù)),則應(yīng)該用則應(yīng)該用”a”方式打開。方式打開。20(4) 用用”r+”、 ”w+” 、 ”a+”方式打開的文件可以用來方式打開的文件可以用來輸入和輸出數(shù)據(jù)。輸入和輸出數(shù)據(jù)。(5) 在程序開始運行時,系統(tǒng)自動打開三個標(biāo)準(zhǔn)文件:在程序開始運行時,系統(tǒng)自動打開三個標(biāo)準(zhǔn)文件:標(biāo)準(zhǔn)輸入標(biāo)準(zhǔn)輸入(stdin)、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)輸出(stdout)、標(biāo)準(zhǔn)出錯輸出、標(biāo)準(zhǔn)出錯輸出(stderr)。4. 標(biāo)準(zhǔn)文件操作方式的說明標(biāo)準(zhǔn)文件操作方式的說明(1-5)21例:打開例:打開C盤根下的盤根下的my文件文件,驗證文件能否正確
14、打開驗證文件能否正確打開.#include void main三三 FILE *fa; if(fa=fopen(”,”r”)=NULL) printf(“n Cannot open the file!”); exit(0); /*退出退出*/ else printf(” n Open! ”); ?提示:提示:1. 該文件在磁盤上不存在該文件在磁盤上不存在/存在存在時,比較運行結(jié)果。時,比較運行結(jié)果。2. 將程序中的將程序中的”r”改為改為”w” ,當(dāng)當(dāng)該文件在磁盤上不存在該文件在磁盤上不存在/存在時,存在時,比較運行結(jié)果比較運行結(jié)果。22三三. 標(biāo)準(zhǔn)文件的關(guān)閉函數(shù)標(biāo)準(zhǔn)文件的關(guān)閉函數(shù): fclo
15、se 關(guān)閉文件指針關(guān)閉文件指針fp所指的文件所指的文件,釋放相應(yīng)的文件信息釋放相應(yīng)的文件信息區(qū)區(qū). 正常關(guān)閉文件時正常關(guān)閉文件時,函數(shù)返回值為函數(shù)返回值為0. 函數(shù)原型函數(shù)原型: int fclose(FILE *fp);功能:功能: 在使用完一個文件后應(yīng)該關(guān)閉它,以防止它再在使用完一個文件后應(yīng)該關(guān)閉它,以防止它再被誤用。被誤用。23函數(shù)原型函數(shù)原型:四四 標(biāo)準(zhǔn)文件讀寫函數(shù)標(biāo)準(zhǔn)文件讀寫函數(shù)1. 1. 讀文件字符函數(shù)讀文件字符函數(shù):fgetc:fgetcfp是指向所讀文是指向所讀文件指針變量件指針變量int fgetc(FILE *fp) ;函數(shù)功能函數(shù)功能: 從文件指針從文件指針fp指向的文件
16、當(dāng)前位置指向的文件當(dāng)前位置(位置指針位置指針)讀讀出一個字符出一個字符,然后文件位置指針自動后移然后文件位置指針自動后移,指向文件中指向文件中的下一個字符的下一個字符,返回值為讀入的字符返回值為讀入的字符. 若遇到文件結(jié)束符若遇到文件結(jié)束符,則返回結(jié)束符則返回結(jié)束符EOF(-1).例例:ch=fgetc(fp);24例例: 將磁盤文件將磁盤文件”的信息讀出并顯示到屏幕上的信息讀出并顯示到屏幕上.(假假設(shè)文件已經(jīng)存在設(shè)文件已經(jīng)存在,若不存在若不存在,可以用記事本或其它文本可以用記事本或其它文本編輯器編輯一個編輯器編輯一個)#include void main三三 FILE *fp; char c
17、; if (fp=fopen( ” , ”r” )=NULL) printf(“n File notexist!”);exit(0); while(c=fgetc(fp)!=EOF) putchar( c ); fclose(fp);25例例11.3 編寫一個程序編寫一個程序,實現(xiàn)實現(xiàn)DOS中的中的type命令的功能命令的功能.#include void main(int argc,char *argv) FILE *fp; char c; if (argc2)printf(”n NO file name”); exit(0); if (fp=fopen( ” , ”r” )=NULL) pr
18、intf(” n File not exist! ”);exit(0); while(c=fgetc(fp)!=EOF) putchar( c ); fclose(fp);262 . 文件寫入字符函數(shù)文件寫入字符函數(shù): fputc函數(shù)返回值函數(shù)返回值: 輸出成功輸出成功, 返回值就是輸出的字符;返回值就是輸出的字符; 輸出失敗輸出失敗, 返回一個返回一個EOF(值為值為-1)。功能:把一個字符功能:把一個字符ch寫到寫到fp指向的磁盤文件上去。指向的磁盤文件上去。函數(shù)原型函數(shù)原型: int fputc(int ch, FILE *fp);例例: FILE *fp; char ch= A;fpu
19、tc(ch,fp)27 putchar函數(shù)就是從函數(shù)就是從fputc函數(shù)派生出來的。函數(shù)派生出來的。 putchar(c)是用是用#define定義的宏:定義的宏: # define putchar( c ) fputc(c,stdout) 同理,同理,getchar函數(shù)是從函數(shù)是從fgetc函數(shù)派生出來的。函數(shù)派生出來的。 getchar(c)是用是用#define定義的宏:定義的宏: # define getchar( c ) fgetc(stdin)注注28例例11.4 從鍵盤輸入一些字符存到一個磁盤文件從鍵盤輸入一些字符存到一個磁盤文件中,以中,以“#” 結(jié)束。結(jié)束。#include
20、void main三三 FILE *fp; char c; if (fp=fopen( ” , ”w” )=NULL) printf(” n File cannot open! ”);exit(0); while(c=getchar( )!=”#” ) fputc ( c,fp ); fclose(fp);29例例11.5 將文件的內(nèi)容復(fù)制到文件中。將文件的內(nèi)容復(fù)制到文件中。#include void main三三 FILE *f1,*f2; if (f1=fopen( ” , ”r” )=NULL) printf(” n File cannot open! ”);exit(0); if (f
21、2=fopen( ” , ”w” )=NULL) printf(” n File cannot creat! ”);exit(0); while(c=fgetc(f1 )!=EOF ) fputc ( c,f2 ); fclose(f1); fclose(f2);303. 3. 讀文件字符串函數(shù)讀文件字符串函數(shù):fgets:fgets 從指針從指針 fp指向的文件中讀取指向的文件中讀取 len 1 個字符,把它個字符,把它送到由指針?biāo)偷接芍羔榖uf 指向的字符數(shù)組中。指向的字符數(shù)組中。char * fgets ( char * buf , int len , FILE *fp) ;函數(shù)原型:函
22、數(shù)原型:函數(shù)功能:函數(shù)功能:字符數(shù)組的長度應(yīng)大于字符數(shù)組的長度應(yīng)大于len,可存放可存放len-1個字符個字符,字符數(shù)組字符數(shù)組的最后一個元素為的最后一個元素為0.若在讀入若在讀入len-1個字符前遇到換行符個字符前遇到換行符n或文件結(jié)束或文件結(jié)束符號符號EOF,立即結(jié)束讀入操作立即結(jié)束讀入操作.31例例11.6 利用函數(shù)利用函數(shù)fgets,將文本文件中的內(nèi)容全部讀將文本文件中的內(nèi)容全部讀出并顯示在屏幕上。出并顯示在屏幕上。分析分析:(1 1)一般地,文本文件以行為單位,每行最多)一般地,文本文件以行為單位,每行最多8080個字符,再個字符,再加上一個行結(jié)束符號即換行符加上一個行結(jié)束符號即換行
23、符nn,則每行至少需要,則每行至少需要8181個字節(jié)的個字節(jié)的存儲空間。存儲空間。(2 2)使用函數(shù))使用函數(shù)fgetsfgets讀取字符串時,若在讀入讀取字符串時,若在讀入len-1len-1個字符完成之個字符完成之前遇到換行符前遇到換行符nn或文件結(jié)束符號或文件結(jié)束符號EOFEOF,立即結(jié)束讀入操作。無論,立即結(jié)束讀入操作。無論讀入的字符是否等于或小于讀入的字符是否等于或小于len-1len-1個,函數(shù)為讀入的字符串之后加一個個,函數(shù)為讀入的字符串之后加一個00。因此,讀入的字符(包括。因此,讀入的字符(包括00)只有)只有l(wèi)enlen個。個。(3 3)定義文件指針。)定義文件指針。(4
24、4)以只讀方式打開文件。)以只讀方式打開文件。(5 5)當(dāng)文件未結(jié)束時,反復(fù)讀出字符串并輸出。)當(dāng)文件未結(jié)束時,反復(fù)讀出字符串并輸出。(6 6)關(guān)閉文件。)關(guān)閉文件。 32#includevoid main講義講義FILE *fp; char str81; if(fp=fopen(”aa.txt”,”rt”)=NULL) printf(”Cannot open file!”); getchar三;三;exit(1); while(fgets(str,81,fp)!=NULL) puts(str);); fclose(fp););例例: 利用函數(shù)利用函數(shù)fgets,將文本文件中的內(nèi)容全部讀出并顯
25、示在屏幕上。將文本文件中的內(nèi)容全部讀出并顯示在屏幕上。334. 將字符串寫入文件的函數(shù)將字符串寫入文件的函數(shù): fputs( )char * fputs ( char * buf, FILE * fp ) ; 把由指針把由指針buf 指向的字符數(shù)組中的字符串指向的字符數(shù)組中的字符串寫入由指針寫入由指針 fp指向的文件中。指向的文件中。buf :字符串常量:字符串常量,字符數(shù)組名字符數(shù)組名,指針變量指針變量函數(shù)原型函數(shù)原型:函數(shù)功能函數(shù)功能:#include void main三FILE *fp; char buf 81; if( (fp=fopen(”, ”a” ) = =NULL) prin
26、tf(” File cannot open! ” );exit(0); while (fgets(buf,81,stdin)!=NULL ) fputs(buf,fp); fclose(fp);例例 從鍵盤輸入若干行字符從鍵盤輸入若干行字符, ,將它們添加到磁盤將它們添加到磁盤文件文件中中.355. 5. 數(shù)據(jù)塊讀寫函數(shù)數(shù)據(jù)塊讀寫函數(shù):fread:fread和和fwritefwritebuffer:是一個指針。是一個指針。 對于對于fread,它是讀入數(shù)據(jù)的存放地址。,它是讀入數(shù)據(jù)的存放地址。 對于對于fwrite,是要輸出數(shù)據(jù)的地址(起始地址)。,是要輸出數(shù)據(jù)的地址(起始地址)。size:
27、要讀寫的字節(jié)數(shù)。要讀寫的字節(jié)數(shù)。count:要進(jìn)行讀寫多少個要進(jìn)行讀寫多少個size字節(jié)的數(shù)據(jù)項。字節(jié)的數(shù)據(jù)項。fp: 文件型指針。文件型指針。int fread(void *buffer,int size,int count,FILE *fp);int fwirte(void *buffer,int size,int count,FILE (fp);函數(shù)原型函數(shù)原型:36例例11.8 11.8 從鍵盤輸入兩個學(xué)生的信息,寫入磁盤文件中從鍵盤輸入兩個學(xué)生的信息,寫入磁盤文件中. .分析:分析:(1 1)建立學(xué)生信息的結(jié)構(gòu)體。)建立學(xué)生信息的結(jié)構(gòu)體。(2 2)定義文件指針。)定義文件指針。(3
28、3)打開指定的文件。)打開指定的文件。(4 4)將學(xué)生信息寫入文件。)將學(xué)生信息寫入文件。(5 5)關(guān)閉文件。)關(guān)閉文件。37#include #include sstruct studentsstruct student char name10 char name10; int numint num; int ageint age; char addr15char addr15; boy2 boy2, * *pppp;#define size sizeof(struct student)#define size sizeof(struct student)38void main三三FILE
29、*fp; char ch,filename20; int i; gets(filename); /*輸入文件名輸入文件名*/ fp=fopen(filename,”wb+”); /*以讀寫方式打開二進(jìn)制文件,也省略了檢測以讀寫方式打開二進(jìn)制文件,也省略了檢測*/ printf(”ninput datan”); pp=boy; for(i=0;iname,&pp-num, &pp-age,pp-addr); fwrite(boy,size,2,fp); fclose(fp);); /*將兩個學(xué)生的信息寫入將兩個學(xué)生的信息寫入文件文件*/39例例11.9 11.9 將磁盤文件中的學(xué)
30、生信息輸出到屏幕上。將磁盤文件中的學(xué)生信息輸出到屏幕上。 #includestruct stuchar name10; int num; int age; char addr15;boy2,*pp;#define size sizeof(struct stu)40void main講義講義FILE *fp; char ch,filename20; int i; gets(filename);); pp=boy; fp=fopen(filename, ”wb+”);); printf(”nnnametnumber age addrn”); fread(pp,size,2,fp); for(i=0
31、;iname, &pp-num,&pp-age,pp-addr); fclose(fp);); 41一般調(diào)用方式為:一般調(diào)用方式為:6. 6. 格式化寫讀函數(shù)格式化寫讀函數(shù):fprintf:fprintf和和fscanffscanffprintf(文件指針,格式字符串,輸出表列(文件指針,格式字符串,輸出表列) );fscanf(文件指針,格式字符串,輸入表列(文件指針,格式字符串,輸入表列); 按照指定格式,向文件寫按照指定格式,向文件寫按照指定格式,從文件讀按照指定格式,從文件讀注意:注意:fprintf和和fscanf函數(shù)對磁盤文件讀寫函數(shù)對磁盤文件讀寫 printf和和
32、scanf函數(shù)對顯示器或鍵盤操作函數(shù)對顯示器或鍵盤操作.42例如例如:fscanf(fp, ”%d,%f”,&i,&t); 按格式字符串規(guī)定的格式,從按格式字符串規(guī)定的格式,從fp指定的文件中讀取指定的文件中讀取數(shù)據(jù)分別送入變量數(shù)據(jù)分別送入變量i和和t中中. .若磁盤文件上有以下字符若磁盤文件上有以下字符: 則:則: 4 i 5.6 tfprintf(fp, ”,i,t);將整型變量將整型變量i和實型變量和實型變量t的值按的值按%d和的格式輸出到和的格式輸出到fp指向指向的文件上的文件上。如果如果,則輸出到磁盤文件上的是以下的字符串則輸出到磁盤文件上的是以下的字符串: : 43
33、例例11.10 按指定的格式按指定的格式, ,將學(xué)生信息寫入到一個二進(jìn)制文件將學(xué)生信息寫入到一個二進(jìn)制文件stud. dat中中.#includestruct studentchar name10; int num; int age; char addr15;boy2,*pp;void main三三FILE *fp; char ch, filename20; int i; gets(filename); pp=boya;if(fp=fopen(filename,”wb+”)=NULL) printf(”Cannot open file!”);getch三;三;exit(1); printf ”
34、ninput datan”);for(i=0;iname,&pp-num,&pp-age,pp-addr);pp=boya; for(i=0;iname,&qq-num,&qq-age, qq-addr);); fclose(fp); 44例例11.11 從從文件文件stud. dat中中,按指定的格式按指定的格式, ,將學(xué)生信息讀出將學(xué)生信息讀出并顯示到屏幕上并顯示到屏幕上.#includevoid main三三FILE *fp; char ch, filename20; int i; struct student boy2,*pp; printf(”nfil
35、ename:”); gets(filename); fp=fopen(filename,”rb+”);for( (i=0; ;iname,& &pp-num, & &pp-age,pp-addr) );printf( (”nnnametnumber age addrn”);pp=boy;for( (i=0; ;iname,pp-num,pp-age, pp-addr) );fclose( (fp) );程序中結(jié)構(gòu)體的說明參考例程序中結(jié)構(gòu)體的說明參考例45五五 文件的隨機讀寫文件的隨機讀寫 移動文件位置指針的操作稱為文件的定位移動文件位置指針的操作稱為文件的定位.
36、 . 實現(xiàn)隨機讀寫的關(guān)鍵是要按指定的條件進(jìn)行文件的定位實現(xiàn)隨機讀寫的關(guān)鍵是要按指定的條件進(jìn)行文件的定位操作。文件定位操作是通過庫函數(shù)的調(diào)用來完成的。操作。文件定位操作是通過庫函數(shù)的調(diào)用來完成的。 在每個打開的文件中,有一個文件位置指針,它在每個打開的文件中,有一個文件位置指針,它指向?qū)⒁x寫的字符位置。當(dāng)對文件進(jìn)行順序讀寫時指向?qū)⒁x寫的字符位置。當(dāng)對文件進(jìn)行順序讀寫時,每讀完一個字符,該位置指針就自動移到下一個字,每讀完一個字符,該位置指針就自動移到下一個字符位置。符位置。 在實際問題中,常要求讀寫文件中某些指定的部分。為了避免不必要的讀或?qū)懙牟僮鳎上纫苿游募奈恢弥羔樀叫枰x寫的位置,再
37、進(jìn)行讀寫,這種讀寫操作方式稱為隨機讀寫隨機讀寫。定位定位隨機讀寫隨機讀寫順序讀寫順序讀寫461. 1. 文件指針定位文件指針定位函數(shù)函數(shù):rewind:rewind函數(shù)原型:函數(shù)原型:int rewindint rewind(FILE FILE * *fpfp););函數(shù)功能:函數(shù)功能:把文件指針把文件指針fpfp指向文件的內(nèi)部位置指針移到文件首。指向文件的內(nèi)部位置指針移到文件首。2.2.文件指針定位函數(shù)文件指針定位函數(shù):fseek:fseek函數(shù)原型:函數(shù)原型:int fseek(FILE *fp,long offset,int pos);函數(shù)功能:函數(shù)功能:將文件指針將文件指針fpfp指向
38、文件的內(nèi)部位置指針從指向文件的內(nèi)部位置指針從pospos指定的位置指定的位置開始移動開始移動offsetoffset個字節(jié)個字節(jié)。47起始點表示方法起始點表示符號數(shù)字表示文件首當(dāng)前位置文件末尾SEEK_SETSEEK_CURSEEK_END012 offset為位移量,表示移動的字節(jié)數(shù),要求位移量是long型數(shù)據(jù),以便在文件長度大于64KB 時不會出錯,當(dāng)用常量表示位移量時,要求加后綴“l(fā)”或“L”. 若offset為負(fù)數(shù),表示向文件首方向移動,否則是向文件尾方向移動; pos為起始點,表示從何處開始計算位移量,規(guī)定的起始點有三種:文件首,當(dāng)前位置和文件尾. 48例如:例如:fseek(fp,
39、100L,0); 文件指針從文件開始處向后移動文件指針從文件開始處向后移動100100個字節(jié)個字節(jié)fseek(fp,60L,1); 文件指針從當(dāng)前位置向后移動文件指針從當(dāng)前位置向后移動6060個字節(jié)個字節(jié)fseek(fp,-10L,2); 文件指針從文件末尾處向前移動文件指針從文件末尾處向前移動1010個字節(jié)個字節(jié)注意:位移量一般被要求是注意:位移量一般被要求是long型數(shù)據(jù),這樣當(dāng)型數(shù)據(jù),這樣當(dāng) 文件的長度大于文件的長度大于64K時不致出問題。時不致出問題。49#include “stdio.h”void main三FILE *fp1,*fp2; fp1=fopen(”, ”r”); fp2
40、=fopen(”, ”w”); while(!feof(fp1) putchar(getc(fp1); rewind(fp1); while(!feof(p1) putc(getc(fp1),fp2); fclose(fp1);fclose(fp2); 例例 有一個磁盤文件,第一次使它顯示在屏幕上,第二次有一個磁盤文件,第一次使它顯示在屏幕上,第二次把它復(fù)制到另一文件上。把它復(fù)制到另一文件上。50例例11.13 11.13 在磁盤文件上存有在磁盤文件上存有1010個學(xué)生的數(shù)據(jù)。要求將第個學(xué)生的數(shù)據(jù)。要求將第1 1、3 3、5 5、7 7、9 9個學(xué)生數(shù)據(jù)輸入計算機,并在屏幕上顯示出來。個學(xué)生數(shù)
41、據(jù)輸入計算機,并在屏幕上顯示出來。 #includestruct student_type char name10; int num; int age; char sex; stud10;51void main三三 int i; FILE *fp; if (fp=fopen(stud.dat, rb)=NULL) printf(cannot open filen); exit(0); 52for(i=0;i10;i+=2) fseek(fp,i*sizeof(struct student_type),0); fread(&studi,sizeof(struct student_type
42、),1,fp); printf(“%s %d %d %cn”, ,studi.num,tudi.age,studi.sex); fclose(fp);53六六. 文件的檢測函數(shù)文件的檢測函數(shù) 1文件結(jié)束檢測函數(shù)feof 函數(shù)原型:int feof(FILE *fp);函數(shù)功能:判斷fp指向的文件是否處于文件結(jié)束位置,如文件結(jié)束,則返回值為1,否則為0。2文件出錯檢測函數(shù)ferror 函數(shù)原型: int ferror(FILE *fp);函數(shù)功能:檢查文件fp在用各種輸入輸出函數(shù)進(jìn)行讀寫時是否出錯。若出錯,返回值為1,否則返回0。3文件出錯標(biāo)志和文件結(jié)束標(biāo)志置0函數(shù)clear
43、err函數(shù)函數(shù)原型:int clearerr(FILE *fp); 函數(shù)功能:用于清除出錯標(biāo)志和文件結(jié)束標(biāo)志,使它們?yōu)?值。 5412.3 非標(biāo)準(zhǔn)文件操作標(biāo)準(zhǔn)文件的輸入和輸出稱為高層I/O。非標(biāo)準(zhǔn)文件的輸入和輸出稱為低層I/O。 在非標(biāo)準(zhǔn)文件系統(tǒng)中系統(tǒng)不會自動提供文件緩沖區(qū)沒有FILE文件指針讀寫文件時和文件聯(lián)系的是一個整數(shù),稱為文件號55一一. . 非標(biāo)準(zhǔn)文件的打開、關(guān)閉非標(biāo)準(zhǔn)文件的打開、關(guān)閉 1打開文件函數(shù)open 函數(shù)原型:函數(shù)原型:int openint open(char char * *filenamefilename,int modeint mode););函數(shù)功能:函數(shù)功能:按按modemode指定的方式打開名為指定的方式打開名為filenamefilename的文件,打開成功,函數(shù)返的文件,打開成功,函數(shù)返回一個正整數(shù)稱為文件號,否則返回回一個正整數(shù)稱為文件號,否則返回-1-1。filenamefilename是任意是任意DOSDOS文件名,可文件名,可以是字符串常量或變量;以是
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 勞務(wù)安全協(xié)議合同范本
- 共同經(jīng)營承包土地合同范本
- 2025年南陽道路運輸貨運考試題庫
- 2025年棗莊年貨運從業(yè)資格證考試題大全
- 包鋼供貨合同范本
- 別墅灌溉維修合同范本
- 倉庫道具租賃合同范本
- 加工車間機床承包合同范本
- 共同做模具合同范本
- 個人售房合同范本
- 臺州事業(yè)單位筆試真題2024
- 父母房產(chǎn)繼承協(xié)議書范本
- 51個行業(yè)領(lǐng)域重大事故隱患判定標(biāo)準(zhǔn)和重點檢查事項匯編
- 2024年高二化學(xué)教案 選擇性必修2(配人教版)第1課時原子結(jié)構(gòu)與性質(zhì)
- 2024-2030年中國空氣閥行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報告
- 人工智能(人工智能大數(shù)據(jù)技術(shù)相關(guān)專業(yè))全套教學(xué)課件
- 2024年輔警招聘考試試題庫附參考答案(綜合題)
- 小學(xué)數(shù)學(xué)主題活動設(shè)計一年級《歡樂購物街》
- 一年級口算天天練1(打印版)
- 垃圾發(fā)電廠汽機培訓(xùn)
- 村情要素模板
評論
0/150
提交評論