




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、黃興鼎版權(quán)所有黃興鼎版權(quán)所有文件的概念文件的概念文件指針文件指針文件的打開與關(guān)閉文件的打開與關(guān)閉文件的讀寫文件的讀寫文件的定位文件的定位程序設(shè)計(jì)舉例程序設(shè)計(jì)舉例黃興鼎版權(quán)所有黃興鼎版權(quán)所有使用數(shù)據(jù)文件的目的1、數(shù)據(jù)文件的改動不引起程序的改動程序與數(shù)據(jù)分離2、不同程序可以訪問同一數(shù)據(jù)文件中的數(shù)據(jù)數(shù)據(jù)共享3、能長期保存程序運(yùn)行的中間數(shù)據(jù)或結(jié)果數(shù)據(jù)文件分類文件分類 按文件的邏輯結(jié)構(gòu):按文件的邏輯結(jié)構(gòu): 記錄文件:由具有一定結(jié)構(gòu)的記錄組成(定長和不定長)記錄文件:由具有一定結(jié)構(gòu)的記錄組成(定長和不定長) 流式文件流式文件:由一個個字符(字節(jié))數(shù)據(jù)順序組成:由一個個字符(字節(jié))數(shù)據(jù)順序組成 按存儲介質(zhì):
2、按存儲介質(zhì): 普通文件:存儲介質(zhì)文件(磁盤、磁帶等)普通文件:存儲介質(zhì)文件(磁盤、磁帶等) 設(shè)備文件設(shè)備文件:非存儲介質(zhì)(鍵盤、顯示器、打印機(jī)等):非存儲介質(zhì)(鍵盤、顯示器、打印機(jī)等) 按數(shù)據(jù)的組織形式:按數(shù)據(jù)的組織形式: 文本文件文本文件: ASCII文件,每個字節(jié)存放一個字符的文件,每個字節(jié)存放一個字符的ASCII碼碼 二進(jìn)制文件二進(jìn)制文件:數(shù)據(jù)按其在內(nèi)存中的存儲形式原樣存放:數(shù)據(jù)按其在內(nèi)存中的存儲形式原樣存放文件文件l存儲在外存儲器上的數(shù)據(jù)集合存儲在外存儲器上的數(shù)據(jù)集合,是操作系統(tǒng)數(shù)據(jù)管理的單位是操作系統(tǒng)數(shù)據(jù)管理的單位.記錄記錄文件文件字段字段字節(jié)字節(jié)位位黃興鼎版權(quán)所有黃興鼎版權(quán)所有文件
3、的分類文件的分類(按存儲形式分按存儲形式分)文件文件二進(jìn)制文件特點(diǎn):存儲量小、速度快、便于存放中間結(jié)果0000000000000001100001010100000二進(jìn)制形式文本文件特點(diǎn):存儲量大、速度慢、便于對字符操作001100010011000000110000001100000011000000110000ASCII形式二進(jìn)制文件二進(jìn)制文件 以數(shù)據(jù)在內(nèi)存中的二進(jìn)制形式保存。以數(shù)據(jù)在內(nèi)存中的二進(jìn)制形式保存。如 int 型數(shù) 100000文本文件文本文件 數(shù)據(jù)被作為字符,并以字符的二進(jìn)制編碼形式保存。數(shù)據(jù)被作為字符,并以字符的二進(jìn)制編碼形式保存。黃興鼎版權(quán)所有黃興鼎版權(quán)所有磁盤文件輸出文件
4、緩沖區(qū)輸入文件緩沖區(qū)程序數(shù)據(jù)區(qū)a緩沖文件系統(tǒng):緩沖區(qū)指令區(qū)程序用戶數(shù)據(jù)區(qū)磁盤非緩沖文件系統(tǒng):文件處理方文件處理方法法向磁盤向磁盤(文件文件)輸出數(shù)據(jù):輸出數(shù)據(jù):數(shù)據(jù)數(shù)據(jù)緩沖區(qū),裝滿緩沖區(qū)后緩沖區(qū),裝滿緩沖區(qū)后磁盤文件。磁盤文件。從磁盤從磁盤(文件文件)讀入數(shù)據(jù):讀入數(shù)據(jù):先一次性從磁盤文件將一批數(shù)據(jù)輸入到緩沖區(qū),然后再從緩沖區(qū)逐個數(shù)據(jù)讀入先一次性從磁盤文件將一批數(shù)據(jù)輸入到緩沖區(qū),然后再從緩沖區(qū)逐個數(shù)據(jù)讀入到變量。到變量。 緩沖文件系統(tǒng)緩沖文件系統(tǒng):高級高級文件系統(tǒng),系統(tǒng)自動為正在使用的文件開辟內(nèi)存緩沖區(qū)文件系統(tǒng),系統(tǒng)自動為正在使用的文件開辟內(nèi)存緩沖區(qū) 非緩沖文件系統(tǒng)非緩沖文件系統(tǒng):低級文件系統(tǒng)
5、,由用戶在程序中為每個文件設(shè)定緩沖區(qū):低級文件系統(tǒng),由用戶在程序中為每個文件設(shè)定緩沖區(qū)黃興鼎版權(quán)所有黃興鼎版權(quán)所有FILE *fp;文件類型指針文件類型指針文件結(jié)構(gòu)體文件結(jié)構(gòu)體FILE 緩沖文件系統(tǒng)為每個正使用的文件在內(nèi)存開辟文件信息區(qū)緩沖文件系統(tǒng)為每個正使用的文件在內(nèi)存開辟文件信息區(qū)文件信息用系統(tǒng)定義的名為文件信息用系統(tǒng)定義的名為FILE的結(jié)構(gòu)體的結(jié)構(gòu)體描述描述程序通過程序通過 FILE類型指針建立和文件的聯(lián)系,進(jìn)行關(guān)類型指針建立和文件的聯(lián)系,進(jìn)行關(guān)于文件的一切操作。于文件的一切操作。文件指針文件指針(指向文件的指針)(指向文件的指針)定義形式:定義形式:FILE *指針變量名指針變量名;
6、舉例:舉例: 定義了一個結(jié)構(gòu)體定義了一個結(jié)構(gòu)體FILE類型的指針變量:類型的指針變量:fp。用于存放文件的緩沖區(qū)首地用于存放文件的緩沖區(qū)首地址,即指向一個文件。址,即指向一個文件。黃興鼎版權(quán)所有黃興鼎版權(quán)所有文件文件文件類型指針文件類型指針typedef struct int _fd; /文件號 int _cleft; /緩沖區(qū)中剩下的字符數(shù) int _mode; /文件操作方式 char *_next; /文件當(dāng)前讀寫位置 char *_buff; /文件緩沖區(qū)位置FILE;FILE定義在定義在stdio.h中中黃興鼎版權(quán)所有黃興鼎版權(quán)所有n文件的打開文件的打開p打開文件打開文件方法:方法:
7、為了打開一個文件,首先要為該文件定義一個文件類型指針;為了打開一個文件,首先要為該文件定義一個文件類型指針;然后用然后用C語言提供的語言提供的fopen()函數(shù)函數(shù)打開文件。打開文件。fopen函數(shù)有兩個參數(shù):函數(shù)有兩個參數(shù):“文件名文件名”與與“文件使用方式文件使用方式”。它們均是字符串。它們均是字符串。一般形式:一般形式:FILE *文件指針名文件指針名;文件指針名文件指針名fopen(文件名文件名,文件使用方式文件使用方式); 黃興鼎版權(quán)所有黃興鼎版權(quán)所有例 文件打開與測試 FILE *fp; fp=fopen(“aa.c”,“w”); if(fp=NULL) printf(“File
8、open error!n”);exit(0);要打開的文件名&C文件操作用文件操作用庫函數(shù)庫函數(shù)實(shí)現(xiàn)實(shí)現(xiàn),包含在包含在stdio.h&文件使用方式文件使用方式:打開文件打開文件-文件讀文件讀/寫寫-關(guān)閉文件關(guān)閉文件&系統(tǒng)系統(tǒng)自動自動打開和關(guān)閉三個打開和關(guān)閉三個標(biāo)準(zhǔn)文件標(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打開文件打開文件fopen 函數(shù)原型:函數(shù)原型: FILE *fopen(char *name,char *mode) 功能:按指定方式打開文件功能:按指定方式打開文件 返值:正常打
9、開,為指向文件結(jié)構(gòu)體的指針;打開失敗,為返值:正常打開,為指向文件結(jié)構(gòu)體的指針;打開失敗,為NULL使用文件方式文件的打開文件的打開黃興鼎版權(quán)所有黃興鼎版權(quán)所有文件文件 用法:用法:文件打開文件打開時,系統(tǒng)時,系統(tǒng)自動自動建立文件結(jié)構(gòu)體,并把指向它的指建立文件結(jié)構(gòu)體,并把指向它的指針返回來,程序通過這個指針獲得針返回來,程序通過這個指針獲得文件信息文件信息,訪問文件。訪問文件。文件關(guān)閉文件關(guān)閉后,它的文件結(jié)構(gòu)體被釋放。后,它的文件結(jié)構(gòu)體被釋放。“r+/rb+” (讀寫)“a/ab” (追加)“w/wb” (只寫)“r/rb” (只讀)“w+/wb+” (讀寫)“a+/ab+” (讀寫)為輸入打
10、開一個文本/二進(jìn)制文件為輸出打開或建立一個文本/二進(jìn)制文件為讀/寫打開一個文本/二進(jìn)制文件為讀/寫建立一個文本/二進(jìn)制文件為讀/寫打開或建立一個文本/二進(jìn)制文件向文本/二進(jìn)制文件尾追加數(shù)據(jù)文件使用方式含義文件的打開文件的打開黃興鼎版權(quán)所有黃興鼎版權(quán)所有打開文件打開文件舉例舉例其意義是在當(dāng)前目錄下打開文件其意義是在當(dāng)前目錄下打開文件filea.dat,文件的使用方式為,文件的使用方式為“只只讀讀”,并使,并使fp指向該文件。指向該文件。 舉例舉例其意義是打開其意義是打開c盤根目錄下的文件盤根目錄下的文件fileabc.dat,這是一個二進(jìn)制文,這是一個二進(jìn)制文件,只允許按二進(jìn)制方式進(jìn)行讀操作。件
11、,只允許按二進(jìn)制方式進(jìn)行讀操作。兩個反斜線兩個反斜線“”中的第一個表示轉(zhuǎn)義字符,第二個表示根目錄。中的第一個表示轉(zhuǎn)義字符,第二個表示根目錄。文件文件FILE *fp;fp = fopen(filea.dat, r); FILE *fpabc;fpabc = fopen(“c:fileabc.dat, rb); 文件的打開文件的打開黃興鼎版權(quán)所有黃興鼎版權(quán)所有文件關(guān)閉文件關(guān)閉fclose 作用作用:使文件指針變量與文件使文件指針變量與文件“脫鉤脫鉤”,釋放文件結(jié)構(gòu)體和文件指針,釋放文件結(jié)構(gòu)體和文件指針 函數(shù)原型:函數(shù)原型:int fclose(FILE *fp)功能:關(guān)閉功能:關(guān)閉fp指向的文件
12、指向的文件返值:正常關(guān)閉為返值:正常關(guān)閉為0;出錯時出錯時,非非0文件打開時返回的文件類型指針磁盤文件輸出文件緩沖區(qū)輸入文件緩沖區(qū)程序數(shù)據(jù)區(qū)a緩沖文件系統(tǒng):fclose不關(guān)閉文件可能會丟失數(shù)據(jù)文件的關(guān)閉文件的關(guān)閉應(yīng)該養(yǎng)成在使用完文件后關(guān)閉文件的習(xí)慣。應(yīng)該養(yǎng)成在使用完文件后關(guān)閉文件的習(xí)慣。黃興鼎版權(quán)所有黃興鼎版權(quán)所有文件操作文件操作文件操作的一般步驟文件操作的一般步驟文件文件/* 定義聲明文件指針定義聲明文件指針 */FILE *fp;/* 打開文件打開文件 */fp = fopen(文件名文件名, r); /* 判斷是否打開文件判斷是否打開文件 */if (fp = NULL) /*當(dāng)文件打開
13、失敗時的處理當(dāng)文件打開失敗時的處理*/ /* 對文件進(jìn)行讀寫操作對文件進(jìn)行讀寫操作 */ /* 關(guān)閉文件關(guān)閉文件 */fclose(fp);在文件打開時,該指針總是指向文件的第在文件打開時,該指針總是指向文件的第一個字節(jié)。一個字節(jié)。讀寫文件時,每讀寫一個字符后,該位置讀寫文件時,每讀寫一個字符后,該位置指針的值會自動加指針的值會自動加1 1,指向下一個字符。,指向下一個字符。黃興鼎版權(quán)所有黃興鼎版權(quán)所有fputc(a, fp);文件的讀寫文件的讀寫fgetc 函數(shù)原型:函數(shù)原型:int fgetc(FILE *fp) 功能:從功能:從fp指向的文件中讀取一字節(jié)代碼指向的文件中讀取一字節(jié)代碼 返
14、值:正常,返回讀到的代碼值返值:正常,返回讀到的代碼值;讀到文件尾或出錯,為讀到文件尾或出錯,為EOFfputc函數(shù)原型函數(shù)原型:int fputc(int c, FILE *fp)功能:把一字節(jié)代碼功能:把一字節(jié)代碼c寫入寫入fp指向的文件中。指向的文件中。返值:正常,返回返值:正常,返回c;出錯,為出錯,為EOF字符字符I/O:fputc與與fgetcch = fgetc(fp);要進(jìn)行文件讀寫要進(jìn)行文件讀寫,文件必須已經(jīng)打開。文件必須已經(jīng)打開。feof()函數(shù)函數(shù)feof(文件指針文件指針);判斷文件位置指針是否已至文件尾返回值:判斷文件位置指針是否已至文件尾返回值:函數(shù)返回值為函數(shù)返回
15、值為1時表示已至文件尾部;時表示已至文件尾部;為為0時則還未到文件結(jié)束處。時則還未到文件結(jié)束處。其值為其值為-1由于由于-1是二進(jìn)制數(shù)的合法值,故將影響文是二進(jìn)制數(shù)的合法值,故將影響文件數(shù)據(jù)的讀取。為解決此問題,件數(shù)據(jù)的讀取。為解決此問題,ANSI C提供提供了專門判斷文件結(jié)束的函數(shù)了專門判斷文件結(jié)束的函數(shù) feof()。黃興鼎版權(quán)所有黃興鼎版權(quán)所有文件的讀寫文件的讀寫C語言支持兩種讀寫文件的方式語言支持兩種讀寫文件的方式順序讀寫順序讀寫從文件中一個接一個地讀寫數(shù)據(jù),僅當(dāng)讀寫了前一個數(shù)據(jù)后,才能讀從文件中一個接一個地讀寫數(shù)據(jù),僅當(dāng)讀寫了前一個數(shù)據(jù)后,才能讀寫下一個數(shù)據(jù)。寫下一個數(shù)據(jù)。在讀寫數(shù)據(jù)
16、后,文件位置指針自動跳到下一個讀寫位置。在讀寫數(shù)據(jù)后,文件位置指針自動跳到下一個讀寫位置。標(biāo)準(zhǔn)輸入輸出只能進(jìn)行順序讀寫。標(biāo)準(zhǔn)輸入輸出只能進(jìn)行順序讀寫。隨機(jī)讀寫隨機(jī)讀寫從文件中讀寫數(shù)據(jù)時可不考慮數(shù)據(jù)在文件中的位置,可以在文件的任從文件中讀寫數(shù)據(jù)時可不考慮數(shù)據(jù)在文件中的位置,可以在文件的任何位置讀寫。何位置讀寫。在讀寫數(shù)據(jù)前,需要將在讀寫數(shù)據(jù)前,需要將文件位置指針文件位置指針移到讀寫位置。移到讀寫位置。當(dāng)文件以讀或?qū)懛绞酱蜷_,文件位置指針設(shè)置在文件頭,若文件以追當(dāng)文件以讀或?qū)懛绞酱蜷_,文件位置指針設(shè)置在文件頭,若文件以追加方式打開,位置設(shè)置在文件末尾。加方式打開,位置設(shè)置在文件末尾。文件文件黃興鼎
17、版權(quán)所有黃興鼎版權(quán)所有 判斷二進(jìn)制文件是否結(jié)束 while(!feof(fp) c=fgetc(fp); . 例 從鍵盤輸入字符,逐個 存到磁盤文件中,直到 輸入#“為止判斷文本文件是否結(jié)束feof 函數(shù)原型:函數(shù)原型: int feof(FILE *fp) 功能:判斷文件是否結(jié)束功能:判斷文件是否結(jié)束 返值:文件結(jié)束,返回真(非返值:文件結(jié)束,返回真(非0);文件未結(jié)束,返回);文件未結(jié)束,返回0#include main() FILE *fp; char ch,*filename=“out.txt”; if(fp=fopen(filename,w)=NULL) printf(cannot
18、open filen);exit(0); printf(Please input string:); ch=getchar(); while(ch!=#) fputc(ch,fp); putchar(ch); ch=getchar(); fclose(fp);黃興鼎版權(quán)所有黃興鼎版權(quán)所有#include main() FILE *in, *out; char ch,infile10,outfile10; scanf(%s,infile); scanf(%s,outfile); if (in = fopen(infile, r)= NULL) printf(Cannot open infile.
19、n); exit(0); if (out = fopen(outfile, w)= NULL) printf(Cannot open outfile.n); exit(0); while (!feof(in) fputc(fgetc(in), out); fclose(in); fclose(out);例 文件拷貝/*例 讀文本文件內(nèi)容, 并顯示此同時*/#include main() FILE *fp; char ch,*filename=“out.txt”; if(fp=fopen(filename,”r)=NULL) printf(cannot open filen); exit(0);
20、 while(ch=fgetc(fp)!=EOF) putchar(ch); fclose(fp);例 讀文本文件內(nèi)容,并顯示黃興鼎版權(quán)所有黃興鼎版權(quán)所有文件文件Cw1501.c/*打開打開“c:infile.c”文件,然后將其復(fù)制到文件,然后將其復(fù)制到“c:outfile.c”。cw1501*/#include stdio.h#include stdlib.hint main() FILE *infp,*outfp; char ch;if(infp = fopen(c:infile.txt, r) = NULL) printf(Cannot open infile.txt.n); exit(
21、0); if (outfp = fopen(c:outfile.c, w) = NULL) printf(Cannot open outfile.c.n); exit(0); while(!feof(infp) if (ch = fgetc(infp) != EOF) fputc(ch,outfp); fclose(infp); fclose(outfp); return 0; 黃興鼎版權(quán)所有黃興鼎版權(quán)所有字符串的讀寫字符串的讀寫讀字符串讀字符串fgets()函數(shù)函數(shù)fgets(字符數(shù)組名字符數(shù)組名, n, 文件指針文件指針); 從指定文件讀入從指定文件讀入n-1個字符到字符數(shù)組,最后加一個個
22、字符到字符數(shù)組,最后加一個0結(jié)束符。結(jié)束符。在讀完在讀完n-1個字符之前遇到換行符或文件結(jié)束符個字符之前遇到換行符或文件結(jié)束符EOF,讀入即結(jié)束。,讀入即結(jié)束。返回值:字符數(shù)組的地址。返回值:字符數(shù)組的地址。舉例舉例從從fp所指的文件中讀出所指的文件中讀出n-1個字符送入字符數(shù)組個字符送入字符數(shù)組str中。中。文件文件fgets(str, n, fp);黃興鼎版權(quán)所有黃興鼎版權(quán)所有字符串的讀寫字符串的讀寫寫字符串寫字符串fputs()函數(shù)函數(shù)fputs(字符數(shù)組名字符數(shù)組名, 文件指針文件指針); 向指定的文件輸出一個字符串,向指定的文件輸出一個字符串,0結(jié)束符不輸出。其中字符結(jié)束符不輸出。其
23、中字符串可以是字符串常量、字符數(shù)組名或指針變量。串可以是字符串常量、字符數(shù)組名或指針變量。返回值:返回值:調(diào)用成功時,返回調(diào)用成功時,返回0;否則返回否則返回EOF。舉例舉例其意義是把字符串其意義是把字符串“abcd”寫入寫入fp所指的文件之中。所指的文件之中。文件文件fputs(“abcd”, fp);黃興鼎版權(quán)所有黃興鼎版權(quán)所有文件文件/*從鍵盤上輸入一串字符,寫入文本文件從鍵盤上輸入一串字符,寫入文本文件“abc.c”中,再將文本文件的內(nèi)容讀出,顯示在中,再將文本文件的內(nèi)容讀出,顯示在屏幕上。屏幕上。Cw1502.c*/#include #include int main() FILE
24、*fp; char str100, ch; if(fp=fopen(c:abc.c,w)=NULL) printf(file open error.n); exit(0); printf(請輸入一串字符:請輸入一串字符:n); gets(str); fputs(str,fp); fclose(fp); if(fp=fopen(c:abc.c, r)=NULL) printf(file open error.n); exit(0); while(!feof(fp) if (ch = fgetc(fp) != EOF) putchar(ch); printf(n); fclose(fp); ret
25、urn 0;黃興鼎版權(quán)所有黃興鼎版權(quán)所有格式化讀寫格式化讀寫格式化讀格式化讀fscanf()函數(shù)函數(shù)fscanf(文件指針文件指針, ”格式控制字符串格式控制字符串”, 地址表列地址表列); 從指定的文件中格式化讀數(shù)據(jù)。從指定的文件中格式化讀數(shù)據(jù)。這個函數(shù)與格式輸入函數(shù)這個函數(shù)與格式輸入函數(shù)scanf( )很相似,它們的區(qū)別在于,很相似,它們的區(qū)別在于,scanf( )函數(shù)是從鍵盤輸入數(shù)據(jù),而函數(shù)是從鍵盤輸入數(shù)據(jù),而fscanf( )函數(shù)是從文件讀入數(shù)函數(shù)是從文件讀入數(shù)據(jù),因此在據(jù),因此在fscanf( )函數(shù)參數(shù)中多了一個文件指針,用于指出從哪函數(shù)參數(shù)中多了一個文件指針,用于指出從哪個文件讀
26、入數(shù)據(jù)。個文件讀入數(shù)據(jù)。舉例舉例 表示從磁盤文件中的讀取一個浮點(diǎn)數(shù)和一個整數(shù),分別存入變量表示從磁盤文件中的讀取一個浮點(diǎn)數(shù)和一個整數(shù),分別存入變量f和和d。文件文件fscanf(fp, “%f%d”, &f, &d);黃興鼎版權(quán)所有黃興鼎版權(quán)所有格式化讀寫格式化讀寫格式化寫格式化寫fprintf()函數(shù)函數(shù)fprintf(文件指針文件指針, ”格式控制字符串格式控制字符串”, 輸出表列輸出表列); 格式化寫數(shù)據(jù)到指定的文件中。格式化寫數(shù)據(jù)到指定的文件中。這個函數(shù)與這個函數(shù)與printf( )函數(shù)很相似,它們的區(qū)別在于,函數(shù)很相似,它們的區(qū)別在于,printf()函數(shù)是函數(shù)是將數(shù)據(jù)輸出到屏幕上,
27、而將數(shù)據(jù)輸出到屏幕上,而fprintf()函數(shù)是將數(shù)據(jù)輸出到文件中,因函數(shù)是將數(shù)據(jù)輸出到文件中,因此在此在fprintf()函數(shù)參數(shù)中多了一個文件指針,用于指出將數(shù)據(jù)輸出函數(shù)參數(shù)中多了一個文件指針,用于指出將數(shù)據(jù)輸出到哪個文件中。到哪個文件中。舉例舉例 表示把變量表示把變量f和和d按指定的格式寫入磁盤文件。按指定的格式寫入磁盤文件。文件文件fprintf(fp, “f=%f, d=%dn”, f, d);黃興鼎版權(quán)所有黃興鼎版權(quán)所有數(shù)據(jù)塊的讀寫數(shù)據(jù)塊的讀寫以數(shù)據(jù)塊方式讀寫文件以數(shù)據(jù)塊方式讀寫文件fscanf()函數(shù)和函數(shù)和fprintf()函數(shù)對磁盤文件讀寫,使用方便,函數(shù)對磁盤文件讀寫,使用
28、方便,易理解。但輸入輸出需要轉(zhuǎn)化。易理解。但輸入輸出需要轉(zhuǎn)化。因此,在內(nèi)存與磁盤頻繁交換數(shù)據(jù)的情況下,最好用因此,在內(nèi)存與磁盤頻繁交換數(shù)據(jù)的情況下,最好用fread()和和fwrite()函數(shù)。函數(shù)。fread(內(nèi)存地址內(nèi)存地址,數(shù)據(jù)項(xiàng)字節(jié)數(shù)數(shù)據(jù)項(xiàng)字節(jié)數(shù),數(shù)據(jù)項(xiàng)個數(shù)數(shù)據(jù)項(xiàng)個數(shù),文件指針文件指針);fwrite(內(nèi)存地址內(nèi)存地址,數(shù)據(jù)項(xiàng)字節(jié)數(shù)數(shù)據(jù)項(xiàng)字節(jié)數(shù),數(shù)據(jù)項(xiàng)個數(shù)數(shù)據(jù)項(xiàng)個數(shù),文件指針文件指針);通常用于對二進(jìn)制文件的讀寫操作。通常用于對二進(jìn)制文件的讀寫操作。舉例舉例文件文件int a5;fread(a, sizeof(int), 5, fp);表示從已打開的一個文件中讀入5個整數(shù),依次送入整型
29、數(shù)組a中。數(shù)據(jù)塊數(shù)據(jù)塊I/O:fread與與fwrite黃興鼎版權(quán)所有黃興鼎版權(quán)所有文件的隨機(jī)讀寫與文件的隨機(jī)讀寫與文件的定位文件的定位文件內(nèi)部的位置文件內(nèi)部的位置按要求移動位置指針,是實(shí)現(xiàn)隨機(jī)讀寫的關(guān)鍵。按要求移動位置指針,是實(shí)現(xiàn)隨機(jī)讀寫的關(guān)鍵。rewind()函數(shù)函數(shù)rewind(文件指針文件指針);使位置指針重新返回到文件的開頭,函數(shù)無返回值。使位置指針重新返回到文件的開頭,函數(shù)無返回值。ftell()函數(shù)函數(shù)ftell();得到當(dāng)前文件指針位置。得到當(dāng)前文件指針位置。返回值:返回值: 調(diào)用成功時,返回調(diào)用成功時,返回long int 數(shù)值,表示文件指針位置;數(shù)值,表示文件指針位置; 出
30、錯返回出錯返回-1L。文件文件黃興鼎版權(quán)所有黃興鼎版權(quán)所有文件的隨機(jī)讀寫文件的隨機(jī)讀寫文件內(nèi)部的位置文件內(nèi)部的位置fseek()函數(shù)用來移動文件內(nèi)部位置指針,其調(diào)用函數(shù)用來移動文件內(nèi)部位置指針,其調(diào)用形式為:形式為:fseek(文件指針,位移量,起始點(diǎn)文件指針,位移量,起始點(diǎn));其中:其中:“文件指針文件指針”指向被移動的文件。指向被移動的文件。 “位移量位移量”表表示移動的字節(jié)數(shù),要求位移量是示移動的字節(jié)數(shù),要求位移量是long型數(shù)據(jù),以便在文型數(shù)據(jù),以便在文件長度大于件長度大于64KB 時不會出錯。當(dāng)用常量表示位移量時,時不會出錯。當(dāng)用常量表示位移量時,要求加后綴要求加后綴“L”?!捌鹗键c(diǎn)
31、起始點(diǎn)”表示從何處開始計(jì)算位移表示從何處開始計(jì)算位移量,規(guī)定的起始點(diǎn)有三種:文件首,當(dāng)前位置和文件尾。量,規(guī)定的起始點(diǎn)有三種:文件首,當(dāng)前位置和文件尾。返回值:操作成功返回返回值:操作成功返回0,否則返回非,否則返回非0。fseek(fp,100L,0);其意義是把位置指針移到離文件首其意義是把位置指針移到離文件首100個字節(jié)處。個字節(jié)處。還要說明的是還要說明的是fseek函數(shù)一般用于二進(jìn)制文件。在文本文件中由于要函數(shù)一般用于二進(jìn)制文件。在文本文件中由于要進(jìn)行轉(zhuǎn)換,故往往計(jì)算的位置會出現(xiàn)錯誤。文件的隨機(jī)讀寫在移動位進(jìn)行轉(zhuǎn)換,故往往計(jì)算的位置會出現(xiàn)錯誤。文件的隨機(jī)讀寫在移動位置指針之后,置指針之
32、后, 即可用前面介紹的任一種讀寫函數(shù)進(jìn)行讀寫。即可用前面介紹的任一種讀寫函數(shù)進(jìn)行讀寫。文件文件黃興鼎版權(quán)所有黃興鼎版權(quán)所有rewind()重新指向文件的開始位置函數(shù)重新指向文件的開始位置函數(shù)函數(shù)函數(shù)rewind()將令指向文件的指針重新指向文件的開始位置。將令指向文件的指針重新指向文件的開始位置。函數(shù)無返回值。其調(diào)用形式為:函數(shù)無返回值。其調(diào)用形式為:rewind(文件指針文件指針, 位移量位移量, 起始點(diǎn)起始點(diǎn));改變文件的位置指針。改變文件的位置指針。其中,其中, 文件指針:是文件打開時返回的文件指針。文件指針:是文件打開時返回的文件指針。 位移量:是指以起始點(diǎn)為基點(diǎn),向前向后移動的字節(jié)數(shù)
33、,可以為負(fù)位移量:是指以起始點(diǎn)為基點(diǎn),向前向后移動的字節(jié)數(shù),可以為負(fù)值。大多數(shù)值。大多數(shù)C語言版本要求位移量為語言版本要求位移量為long型數(shù)。型數(shù)。 起始點(diǎn):表示從何處開始計(jì)算位移量,規(guī)定的起始點(diǎn)有:起始點(diǎn):表示從何處開始計(jì)算位移量,規(guī)定的起始點(diǎn)有:起始點(diǎn)起始點(diǎn)名字名字?jǐn)?shù)字代號數(shù)字代號文件開始文件開始SEEK_SET SEEK_SET 0 0 當(dāng)前位置當(dāng)前位置SEEK_CURSEEK_CUR1 1文件末尾文件末尾SEEK_ENDSEEK_END2 2黃興鼎版權(quán)所有黃興鼎版權(quán)所有案例分析:文件的隨機(jī)讀寫案例分析:文件的隨機(jī)讀寫文件文件/*設(shè)文件設(shè)文件“alphabet.c”中存放了字母表中存放
34、了字母表“AZ”,現(xiàn)在打開這個文件,用從尾,現(xiàn)在打開這個文件,用從尾部倒著讀的方式將其信息讀出并送屏幕顯示。部倒著讀的方式將其信息讀出并送屏幕顯示。 Cw1503.c */#include #include int main() FILE *fp; long i; if(fp=fopen(c:alphabet.c, rb)= NULL) printf(file open error.n); exit(0); for(i=1;i0 向后移動0 向前移動起始點(diǎn)文件開始 SEEK_SET 0文件當(dāng)前位置 SEEK_CUR 1文件末尾 SEEK_END 2例 fseek(fp,100L,0); fse
35、ek(fp,50L,1); fseek(fp,-10L,2); ftell函數(shù)函數(shù) 函數(shù)原型:函數(shù)原型: long ftell(FILE *fp) 功能:返回位置指針當(dāng)前位置功能:返回位置指針當(dāng)前位置(用相對文件開頭的位移量表示用相對文件開頭的位移量表示) 返值:成功,返回當(dāng)前位置指針位置;失敗,返回返值:成功,返回當(dāng)前位置指針位置;失敗,返回-1L,例 磁盤文件上有3個學(xué)生數(shù)據(jù),要求讀入第1,3學(xué)生數(shù)據(jù)并顯示main() int i; FILE *fp; if(fp=fopen(studat,rb)=NULL) printf(cant open filen);exit(0); for(i=0
36、;i3;i+=2) fseek(fp,i*sizeof(struct student_type),0); fread(&studi,sizeof(struct student_type),1,fp); printf(%s %d %d %sn, ,studi.num,studi.age,studi.addr); fclose(fp);#include struct student_type int num; char name10; int age; char addr15;stud3;#includestdio.h main() FILE *fp; char filenam
37、e80; long length; gets(filename); fp=fopen(filename,rb); if(fp=NULL) printf(file not found!n); else fseek(fp,0L,SEEK_END); length=ftell(fp); printf(Length of File is %1d bytesn,length); fclose(fp); 例 求文件長度(ch12_101.c)黃興鼎版權(quán)所有黃興鼎版權(quán)所有ferror函數(shù)函數(shù) 函數(shù)原型:函數(shù)原型: int ferror(FILE *fp) 功能:測試文件是否出現(xiàn)錯誤功能:測試文件是否出現(xiàn)錯誤 返值:未出錯,返值:未出錯,0;出錯,非;出錯,非0 說明說明每次調(diào)用文件輸入輸出函數(shù),均產(chǎn)生一個新的每次調(diào)用文件輸入輸出函數(shù),均產(chǎn)生一個新的ferror函數(shù)值,函數(shù)值,所以應(yīng)及時測試所以應(yīng)及時測試fopen打開文件時,打開文件時,ferror函數(shù)初值自動置為函數(shù)初值自動置為0出錯的檢測出錯的檢測黃興鼎版權(quán)所有黃興鼎版權(quán)所有clearerr函數(shù)函數(shù) 函數(shù)原型:函數(shù)原型: void clearerr(FILE *fp) 功能:使文
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公路ppp合同范本
- 分紅比例合同范本
- 公路規(guī)劃合同范本
- 協(xié)議合同范本寫法
- 兼職還款合同范本
- pos機(jī)推廣合同范本
- 入股店鋪協(xié)議合同范本
- 義齒加工合同范本模板
- 京東入職合同范本
- 醫(yī)院整體轉(zhuǎn)讓合同范本
- GB/T 24338.1-2018軌道交通電磁兼容第1部分:總則
- GB/T 13145-2018冷藏集裝箱堆場技術(shù)管理要求
- 《城市管理綜合執(zhí)法問題研究國內(nèi)外文獻(xiàn)綜述》4800字
- 數(shù)據(jù)結(jié)構(gòu)英文教學(xué)課件:chapter4 Stacks and Queues
- 結(jié)構(gòu)化面試題型及套路
- 無人機(jī)測繪技術(shù)及應(yīng)用課件
- 生殖崇拜專題知識講座
- 工業(yè)CT發(fā)展及應(yīng)用課件
- 浦發(fā)銀行個人信用報(bào)告異議申請表
- DBJ50∕T-098-2019 城市綠化養(yǎng)護(hù)質(zhì)量標(biāo)準(zhǔn)
- 五子棋棋盤完整
評論
0/150
提交評論