




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第13章 文 件在程序運行時,程序本身和數(shù)據(jù)一般都存放在內(nèi)存中。當(dāng)程序運行結(jié)束后,存放在內(nèi)存中的數(shù)據(jù)被釋放。如果需要長期保存程序運行所需的原始數(shù)據(jù),或程序運行產(chǎn)生的結(jié)果,就必須以文件形式存儲到外部存儲介質(zhì)上。13.1 語言文件概述 1文件與文件名 文件是指存放在外部存儲介質(zhì)上的數(shù)據(jù)集合。為標(biāo)識一個文件,每個文件都必須有一個文件名,其一般結(jié)構(gòu)為:主文件名.擴展名 文件命名規(guī)則,遵循操作系統(tǒng)的約定。Dos中為8.32文件分類可以從不同的角度對文件進行分類:(1)根據(jù)文件的內(nèi)容,可分為程序文件和數(shù)據(jù)文件,程序文件又可分為源文件.c、目標(biāo)文件.obj和可執(zhí)行文件.exe。(2)根據(jù)文件的組織形式,可分
2、為順序存取文件和隨機存取文件。(3)根據(jù)文件的存儲形式,可分為ASCII碼文件和二進制文件。 ASCII碼文件的每1個字節(jié)存儲1個字符,因而便于對字符進行逐個處理。但一般占用存儲空間較多,而且要花費轉(zhuǎn)換時間(二進制與ASCII碼之間的轉(zhuǎn)換)。二進制文件是把內(nèi)存中的數(shù)據(jù),原樣輸出到磁盤文件中。可以節(jié)省存儲空間和轉(zhuǎn)換時間,但1個字節(jié)并不對應(yīng)1個字符,不能直接輸出字符形式。3讀文件與寫文件所謂讀文件是指,將磁盤文件中的數(shù)據(jù)傳送到計算機內(nèi)存的操作。所謂寫文件是指,從計算機內(nèi)存向磁盤文件中傳送數(shù)據(jù)的操作。4構(gòu)成文件的基本單元與流式文件語言將文件看作是由一個一個的字符(ASCII碼文件)或字節(jié)(二進制文件
3、)組成的。將這種文件稱為流式文件。而在其它高級語言中,組成文件的基本單位是記錄,對文件操作的基本單位也是記錄。5文件類型FILE系統(tǒng)給每個打開的文件都在內(nèi)存中開辟一個區(qū)域,用于存放文件的有關(guān)信息(如文件名、文件位置等)。這些信息保存在一個結(jié)構(gòu)類型變量中,該結(jié)構(gòu)類型由系統(tǒng)定義、取名為FILE。注意:結(jié)構(gòu)類型名“FILE”必須大寫。6ANSI C的緩沖文件系統(tǒng)所謂緩沖文件系統(tǒng)是指,系統(tǒng)自動地在內(nèi)存區(qū)為每個正在使用的文件開辟一個緩沖區(qū)。從內(nèi)存向磁盤輸出數(shù)據(jù)時,必須首先輸出到緩沖區(qū)中。待緩沖區(qū)裝滿后,再一起輸出到磁盤文件中。從磁盤文件向內(nèi)存讀入數(shù)據(jù)時,則正好相反:首先將一批數(shù)據(jù)讀入到緩沖區(qū)中,再從緩沖
4、區(qū)中將數(shù)據(jù)逐個送到程序數(shù)據(jù)區(qū)。13.2 文件的打開與關(guān)閉對文件進行操作之前,必須先打開該文件;使用結(jié)束后,應(yīng)立即關(guān)閉,以免數(shù)據(jù)丟失。語言規(guī)定了標(biāo)準(zhǔn)輸入輸出函數(shù)庫,用fopen()函數(shù)打開一個文件,用fclose()函數(shù)關(guān)閉一個文件。 13.2.1 文件的打開fopen()函數(shù) 1用法: FILE *fopen(文件名,操作方式); 2功能:返回一個指向指定文件的指針。 3函數(shù)原型:stdio.h 。注:對文件操作的庫函數(shù),函數(shù)原型均在頭文件stdio.h中。后續(xù)函數(shù)不再贅述。(1)“文件名”是指要打開(或創(chuàng)建)的文件名。如果使用字符數(shù)組(或字符指針),則不使用雙引號。(2)“操作方式”如表12
5、-1所示。例如,F(xiàn)ILE *fp; fpfopen(data.99,r);3說明(1)如果不能實現(xiàn)打開指定文件的操作,則fopen()函數(shù)返回一個空指針NULL (其值在頭文件stdio.h中被定義為)。為增強程序的可靠性,常用下面的方法打開一個文件: if(fp=fopen(文件名,操作方式)=NULL) printf(can not open this filen); exit(0); 關(guān)于exit()函數(shù)1)用法:void exit(程序狀態(tài)值);2)功能:關(guān)閉已打開的所有文件,結(jié)束程序運行,返回操作系統(tǒng),并將“程序狀態(tài)值”返回給操作系統(tǒng)。當(dāng)“程序狀態(tài)值”為時,表示程序正常退出;非值時,
6、表示程序出錯退出。(2)“r(b)+”與“a(b)+”的區(qū)別:使用前者打開文件時,讀寫位置指針指向文件頭;使用后者時,讀寫指針指向文件尾。(3)使用文本文件向計算機系統(tǒng)輸入數(shù)據(jù)時,系統(tǒng)自動將回車換行符轉(zhuǎn)換成一個換行符;在輸出時,將換行符轉(zhuǎn)換成回車和換行兩個字符。使用二進制文件時,內(nèi)存中的數(shù)據(jù)形式與數(shù)據(jù)文件中的形式完全一樣,就不再進行轉(zhuǎn)換。(4)有些編譯系統(tǒng),可能并不完全提供上述對文件的操作方式,或采用的表示符號不同,請注意所使用系統(tǒng)的規(guī)定。(5)在程序開始運行時,系統(tǒng)自動打開三個標(biāo)準(zhǔn)文件,并分別定義了文件指針: 1)標(biāo)準(zhǔn)輸入文件stdin:指向終端輸入(一般為鍵盤)。如果程序中指定要從stdi
7、n所指的文件輸入數(shù)據(jù),就是從終端鍵盤上輸入數(shù)據(jù)。2)標(biāo)準(zhǔn)輸出文件stdout:指向終端輸出(一般為顯示器)。3)標(biāo)準(zhǔn)錯誤文件stderr:指向終端標(biāo)準(zhǔn)錯誤輸出(一般為顯示器)。13.2.2 文件的關(guān)閉fcolse()函數(shù)1用法: int fclose(FILE *文件指針);2功能:關(guān)閉“文件指針”所指向的文件。如果正常關(guān)閉了文件,則函數(shù)返回值為;否則,返回值為非。例如,fclose(fp);/*關(guān)閉fp所指向的文件*/13.3 文件的讀寫操作文件打開之后,就可以對它進行讀與寫的操作了。13.3 文件的讀寫操作13.3.1 讀寫文件中的一個字符1將一個字符寫到文件中fputc()函數(shù)例13.1
8、 將鍵盤上輸入的一個字符串(以“”作為結(jié)束字符),以ASCII碼形式存儲到一個磁盤文件中。#include “stdio.h”main(int argc, char *argv) FILE *fp; char ch; if(argc!=2) /*參數(shù)個數(shù)不對*/ printf(the number of arguments not correctnn); printf(“Usage: 可執(zhí)行文件名 filename n”); exit(0); if (fp=fopen(argv1,w)=NULL) /*打開文件失敗*/ printf(can not open this filen); exit
9、(0); /*輸入字符,并存儲到指定文件中*/ for( ; (ch=getchar() != ; ) fputc(ch,fp); /*輸入字符并存儲到文件中*/ fclose(fp); /*關(guān)閉文件*/ 程序運行情況: abcdefg1234567庫函數(shù)fputc():1)用法:int fputc(字符數(shù)據(jù),文件指針);其中“字符數(shù)據(jù)”,既可以是字符常量,也可以是字符變量。2)功能:將字符數(shù)據(jù)輸出到“文件指針”所指向的文件中去,同時將讀寫位置指針向前移動1個字節(jié)(即指向下一個寫入位置)。如果輸出成功,則函數(shù)返回值就是輸出的字符數(shù)據(jù);否則,返回一個符號常量EOF(其值在頭文件stdio.h中,
10、被定義為-1)。2從文件中讀入一個字符fgetc()函數(shù)和feof()函數(shù)例13.2 順序顯示例13.1創(chuàng)建的磁盤ASCII碼文件。#include stdio.hmain(int argc, char *argv) FILE *fp; char ch; if(argc!=2) /*參數(shù)個數(shù)不對*/ printf(the number of arguments not correctn); printf(“n Usage: 可執(zhí)行文件名 源文件名); exit(0); if (fp=fopen(argv1,r)=NULL) printf(can not open source filen);
11、exit(0); /*順序輸出文件的內(nèi)容*/ for(; (ch=fgetc(fp)!=EOF; ) putchar(ch); /*順序讀入并顯示*/ fclose(fp); /*關(guān)閉打開的文件*/ 程序運行情況: abcdefg1234567(1)庫函數(shù)fgetc() 1)用法:int fgetc(文件指針); 2)功能:從“文件指針”所指向的文件中,讀入一個字符,同時將讀寫位置指針向前移動1個字節(jié)(即指向下一個字符)。該函數(shù)無出錯返回值。例如,fgetc(fp)表達式,從文件fp中讀一個字符,同時將fp的讀寫位置指針向前移動到下一個字符。(2)關(guān)于符號常量EOF 在對ASCII碼文件執(zhí)行讀
12、入操作時,如果遇到文件尾,則讀操作函數(shù)返回一個文件結(jié)束標(biāo)志EOF(其值在頭文件stdio.h中被定義為-1)。在對二進制文件執(zhí)行讀入操作時,必須使用庫函數(shù)feof()來判斷是否遇到文件尾。 例13.3 實現(xiàn)制作ASCII碼文件副本的功能。#include stdio.hmain(int argc, char *argv) FILE *input, *output;/* input:源文件指針, output:目標(biāo)文件指針 */ char ch; if(argc!=3) /*參數(shù)個數(shù)不對*/ printf(the number of arguments not correctn); printf
13、(n Usage: 可執(zhí)行文件名 source-file dest-file); exit(0); if (input =fopen(argv1,r)=NULL) /*打開源文件失敗*/ printf(can not open source filen); exit(0); if (output =fopen(argv2,w)=NULL) /*創(chuàng)建目標(biāo)文件失敗*/ printf(can not create destination filen); exit(0); /*復(fù)制源文件到目標(biāo)文件中*/ for( ; (!feof(input) ; ) fputc(fgetc(input),outpu
14、t); fclose(input); fclose(output);/*關(guān)閉源文件和目標(biāo)文件*/ 庫函數(shù)feof(): 1)用法:int feof(文件指針); 2)功能:在執(zhí)行讀文件操作時,如果遇到文件尾,則函數(shù)返回邏輯真(1);否則,則返回邏輯假(0)。feof()函數(shù)同時適用于ASCII碼文件和二進制文件。 例如,!feof(input)表示源文件(用于輸入)未結(jié)束,循環(huán)繼續(xù)。13.3.2 讀寫一個字符串fgets()和fputs()例13.3b 將鍵盤上輸入的一個長度不超過80的字符串,以ASCII碼形式存儲到一個磁盤文件中;然后再輸出到屏幕上。#include stdio.hmain
15、(int argc, char *argv) FILE *fp; char string81;/*字符數(shù)組用于暫存輸入輸出的字符串*/ if(argc2) /*參數(shù)太多,提示 出錯*/ printf(Too many parametersnn); printf(Usage: 可執(zhí)行文件名 filenamen); exit(0); if(argc=1) /*缺磁盤文件名,提示輸入*/ printf(Input the filename: ); gets(string);/*借用string暫存輸入的文件名*/ argv1=(char *)malloc(strlen(string)+1);/*給文
16、件名參數(shù)申請內(nèi)存空間*/ strcpy(argv1,string);/*復(fù)制文件名到形參中*/ if (fp=fopen(argv1,w)=NULL) /*打開文件失敗*/ printf(can not open this filen); exit(0); /*從鍵盤上輸入字符串,并存儲到指定文件中*/ printf(Input a string: ); gets(string);/*從鍵盤上輸入字符串*/ fputs(string, fp);/*存儲到指定文件*/ fclose(fp); /*重新打開文件,讀出其中的字符串,并輸出到屏幕上*/ if (fp=fopen(argv1,r)=NU
17、LL) /*打開文件失敗*/ printf(can not open this filen); exit(0); fgets(string, strlen(string)+1, fp);/*從文件中讀一個字符串*/ printf(Output the string: ); puts(string);/*將字符串輸出到屏幕上*/ fclose(fp); (1)為增強程序的可靠性,程序中對參數(shù)過多的情況,提示出錯、并終止程序運行;而遺漏文件名時,提示用戶輸入。 同時,為增強程序的人機交互性,凡是需要用戶輸入數(shù)據(jù)的地方,都設(shè)置提示輸入的信息;凡是輸出數(shù)據(jù)的地方,都設(shè)置輸出說明信息。(2) 庫函數(shù)fp
18、uts()向指定文件輸出一個字符串1)用法:int fputs(字符串,文件指針);其中“字符串”可以是一個字符串常量,或字符數(shù)組名,或字符指針變量名。2)功能:向指定文件輸出一個字符串,同時將讀寫位置指針向前移動strlength(字符串長度)個字節(jié)。如果輸出成功,則函數(shù)返回值為;否則,為非值。(3) 庫函數(shù)fgets()從文件中讀一個字符串 1)用法:char *fgets(指針,串長度+1,文件指針); 2)功能:從指定文件中讀入一個字符串,存入“字符數(shù)組指針”中,并在尾端自動加一個結(jié)束標(biāo)志0;同時,將讀寫位置指針向前移動strlength(字符串長度)個字節(jié)。 如果在讀入規(guī)定長度之前遇
19、到文件尾EOF或換行符,讀入即結(jié)束。13.3.3 讀寫一個數(shù)據(jù)塊fread()和fwrite()實際應(yīng)用中,常常要求1次讀寫1個數(shù)據(jù)塊。為此,ANSI C 標(biāo)準(zhǔn)設(shè)置了 fread( ) 和fwrite()函數(shù)。 1用法:int fread(void *buffer,int size,int count,F(xiàn)ILE *fp);int fwrite(void *buffer,int size,int count,F(xiàn)ILE *fp); 2功能:fread()從fp所指向文件的當(dāng)前位置開始,一次讀入size個字節(jié),重復(fù)count次,并將讀入的數(shù)據(jù)存放到從buffer開始的內(nèi)存中;同時,將讀寫位置指針向前
20、移動size* count個字節(jié)。其中,buffer是存放讀入數(shù)據(jù)的起始地址(即存放何處)。fwrite()從buffer開始,一次輸出size個字節(jié),重復(fù)count次, 并將輸出的數(shù)據(jù)存放到fp所指向的文件中;同時,將讀寫位置指針向前移動size* count個字節(jié)。其中,buffer是要輸出數(shù)據(jù)在內(nèi)存中的起始地址(即從何處開始輸出)。如果調(diào)用fread()或fwrite()成功,則函數(shù)返回值等于count。fread()和fwrite()函數(shù),一般用于二進制文件的處理。例13.3c從鍵盤輸入兩個學(xué)生數(shù)據(jù),寫入一個文件中, 再讀出這兩 個學(xué)生的數(shù)據(jù)顯示在屏幕上。#include struct
21、 stu char name10; int num; int age; char addr15;boya2,boyb2,*pp,*qq;main() FILE *fp; char ch; int i; pp=boya; qq=boyb; if(fp=fopen(stu_list,wb+)=NULL) printf(Cannot open file strike any key exit!); getch(); exit(1); printf(ninput datan); for(i=0;iname,&pp-num,&pp-age,pp-addr); pp=boya; fwrite(pp,siz
22、eof(struct stu),2,fp); rewind(fp); fread(qq,sizeof(struct stu),2,fp); printf(nnnametnumber age addrn); for(i=0;iname,qq-num,qq-age,qq-addr); fclose(fp);13.3.4 對文件進行格式化讀寫fscanf()和fprintf()函數(shù) 與scanf()和printf()函數(shù)的功能相似,區(qū)別在于:fscanf()和fprintf()函數(shù)的操作對象是指定文件,而scanf()和printf()函數(shù)的操作對象是標(biāo)準(zhǔn)輸入(stdin)輸出(stdout)文件。
23、 int fscanf(文件指針,格式符,輸入變量首地址表); int fprintf(文件指針,格式符,輸出參量表); 例如,. int i=3; float f=9.80; . fprintf(fp,%2d,%6.2f, i, f); . fprintf()函數(shù)的作用是,將變量i按%2d格式、變量f按%6.2f格式, 以逗號作分隔符,輸出到fp所指向的文件中:3,9.80(表示1個空格)。13.3.5 讀寫函數(shù)的選用原則從功能角度來說,fread()和fwrite()函數(shù)可以完成文件的任何數(shù)據(jù)讀寫操作。 但為方便起見,依下列原則選用: 1讀/寫1個字符(或字節(jié))數(shù)據(jù)時:選用fgetc()和
24、fputc()函數(shù)。 2讀/寫1個字符串時:選用fgets()和fputs()函數(shù)。 3讀/寫1個(或多個)不含格式的數(shù)據(jù)時:選用fread()和fwrite()函數(shù)。 4讀/寫1個(或多個)含格式的數(shù)據(jù)時:選用fscanf()和fprintf()函數(shù)。13.4 位置指針與文件定位文件中有一個讀寫位置指針,指向當(dāng)前的讀寫位置。每次讀寫1個(或1組)數(shù)據(jù)后,系統(tǒng)自動將位置指針移動到下一個讀寫位置上。 如果想改變系統(tǒng)這種讀寫規(guī)律,可使用有關(guān)文件定位的函數(shù)。 13.4.1 位置指針復(fù)位函數(shù)rewind() 1用法:int rewind(文件指針); 2功能:使文件的位置指針返回到文件頭。 13.4.
25、2 隨機讀寫與fseek()函數(shù) 對于流式文件,既可以順序讀寫,也可隨機讀寫,關(guān)鍵在于控制文件的位置指針。 所謂順序讀寫是指,讀寫完當(dāng)前數(shù)據(jù)后,系統(tǒng)自動將文件的位置指針移動到下一個讀寫位置上。所謂隨機讀寫是指,讀寫完當(dāng)前數(shù)據(jù)后,可通過調(diào)用fseek()函數(shù),將位置指針移動到文件中任何一個地方。 1用法:int fseek(文件指針,位移量,參照點); 2功能:將指定文件的位置指針,從參照點開始,移動指定的字節(jié)數(shù)。(1)參照點:用0(文件頭)、1(當(dāng)前位置)和(文件尾)表示。在ANSI C標(biāo)準(zhǔn)中,還規(guī)定了下面的名字: SEEK_SET文件頭, SEEK_CUR當(dāng)前位置, SEEK_END文件尾(
26、2)位移量:以參照點為起點,向前(當(dāng)位移量時)或后(當(dāng)位移量時)移動的字節(jié)數(shù)。在ANSI C標(biāo)準(zhǔn)中,要求位移量為long int型數(shù)據(jù)。fseek()函數(shù)一般用于二進制文件。13.4.3 返回文件當(dāng)前位置的函數(shù)ftell()由于文件的位置指針可以任意移動,也經(jīng)常移動,往往容易迷失當(dāng)前位置,ftell()就可以解決這個問題。 1用法:long ftell(文件指針); 2功能:返回文件位置指針的當(dāng)前位置(用相對于文件頭的位移量表示)。 如果返回值為-1L,則表明調(diào)用出錯。例如: offset=ftell(fp); if(offset= =-1L)printf(“ftell() errorn”);
27、例13.4在學(xué)生文件stu list中讀出第二個學(xué)生的數(shù)據(jù)。#includestruct stu char name10; int num; int age; char addr15;boy,*qq;main() FILE *fp; char ch; int i=1; qq=&boy; if(fp=fopen(stu_list,rb)=NULL) printf(Cannot open file strike any key exit!); getch(); exit(1); rewind(fp); fseek(fp,i*sizeof(struct stu),0); fread(qq,sizeo
28、f(struct stu),1,fp); printf(nnnametnumber age addrn); printf(%st%5d %7d %sn,qq-name,qq-num,qq-age, qq-addr);13.5 出錯檢測 13.5.1 ferror()函數(shù) 在調(diào)用輸入輸出庫函數(shù)時,如果出錯,除了函數(shù)返回值有所反映外,也可利用ferror()函數(shù)來檢測。 1用法: int ferror(文件指針); 2功能:如果函數(shù)返回值為0,表示未出錯;如果返回一個非0值,表示出錯。 (1)對同一文件,每次調(diào)用輸入輸出函數(shù)均產(chǎn)生一個新的ferror()函數(shù)值。因此在調(diào)用了輸入輸出函數(shù)后,應(yīng)立即檢測,否則出錯信息會丟失。 (2)在執(zhí)行fopen()函數(shù)時,系統(tǒng)將ferror()的值自動置為0。13.5.2 clearerr()函數(shù)1用法: void clearerr(文件指針);2功能:將
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)合同范本制作
- 口才教室出租合同范本
- 企業(yè)采購合作合同范例
- 以物抵債合同范本
- 冷凍品購銷合同范例
- 合唱排練協(xié)議合同范本
- 周口市安置房買賣合同范例
- 品牌店 轉(zhuǎn)讓 合同范本
- 廠房買賣合同范本模板
- 廚師人工合同范本
- 《從外觀看豬病診治》課件
- 《莫比烏斯環(huán)》課件
- 2025海南省交通投資控股限公司招聘30人高頻重點提升(共500題)附帶答案詳解
- 《工業(yè)機器人現(xiàn)場編程》課件-任務(wù)3.涂膠機器人工作站
- 富饒的西沙群島課件
- 中英文對照版 ASTM B594 2019 鋁合金形變產(chǎn)品超聲波檢測標(biāo)準(zhǔn)慣例
- 李四光《看看我們的地球》原文閱讀
- 五年級下冊道德與法治教學(xué)計劃
- 2024年全國“紀(jì)檢監(jiān)察”業(yè)務(wù)相關(guān)知識考試題庫(附含答案)
- 2025屆高考數(shù)學(xué)專項復(fù)習(xí):阿基米德三角形【六大題型】含答案
- 讀書分享-于永正-我怎樣教語文
評論
0/150
提交評論