版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第十三章 文件,13.1 語言文件概述 1. 文件與文件名 文件是指存放在外部存儲介質(zhì)上的數(shù)據(jù)集合。 為標(biāo)識一個文件,每個文件都必須有一個文件名,其一般結(jié)構(gòu)為:主文件名.擴(kuò)展名 文件命名規(guī)則,遵循操作系統(tǒng)的約定。 2. 文件分類 可以從不同的角度對文件進(jìn)行分類: (1)根據(jù)文件的內(nèi)容,可分為程序文件和數(shù)據(jù)文件,程序文件又可分為源文件、目標(biāo)文件和可執(zhí)行文件。 (2)根據(jù)文件的組織形式,可分為順序存取文件和隨機(jī)存取文件。,(3)根據(jù)文件的存儲形式,可分為ASCII碼文件和二進(jìn)制文件。 ASCII碼文件的每1個字節(jié)存儲1個字符,因而便于對字符進(jìn)行逐個處理。但一般占用存儲空間較多,而且要花費(fèi)轉(zhuǎn)換時間(
2、二進(jìn)制與ASCII碼之間的轉(zhuǎn)換)。 二進(jìn)制文件是把內(nèi)存中的數(shù)據(jù),原樣輸出到磁盤文件中。可以節(jié)省存儲空間和轉(zhuǎn)換時間,但1個字節(jié)并不對應(yīng)1個字符,不能直接輸出字符形式。 3. 讀文件與寫文件 所謂讀文件是指,將磁盤文件中的數(shù)據(jù)傳送到計(jì)算機(jī)內(nèi)存的操作。 所謂寫文件是指,從計(jì)算機(jī)內(nèi)存向磁盤文件中傳送數(shù)據(jù)的操作。,4. 構(gòu)成文件的基本單元與流式文件 語言將文件看作是由一個一個的字符(ASCII碼文件)或字節(jié)(二進(jìn)制文件)組成的。將這種文件稱為流式文件。 而在其它高級語言中,組成文件的基本單位是記錄,對文件操作的基本單位也是記錄。 5. 文件類型FILE 系統(tǒng)給每個打開的文件都在內(nèi)存中開辟一個區(qū)域,用于存
3、放文件的有關(guān)信息(如文件名、文件位置等)。這些信息保存在一個結(jié)構(gòu)類型變量中,該結(jié)構(gòu)類型由系統(tǒng)定義、取名為FILE。 注意:結(jié)構(gòu)類型名“FILE”必須大寫。,6 .文件指針 文件指針在語言中用一個指針變量指向一個文件, 這個指針稱為文件指針。通過文件指針就可對它所指的文件進(jìn)行各種操作。 定義說明文件指針的一般形式為: FILE* 指針變量標(biāo)識符; 其中FILE應(yīng)為大寫,它實(shí)際上是由系統(tǒng)定義的一個結(jié)構(gòu), 該結(jié)構(gòu)中含有文件名、文件狀態(tài)和文件當(dāng)前位置等信息。 在編寫源程序時不必關(guān)心FILE結(jié)構(gòu)的細(xì)節(jié)。例如:FILE *fp; 表示fp是指向FILE結(jié)構(gòu)的指針變量,通過fp 即可找存放某個文件信息的結(jié)構(gòu)
4、變量,然后按結(jié)構(gòu)變量提供的信息找到該文件, 實(shí)施對文件的操作。習(xí)慣上也籠統(tǒng)地把fp稱為指向一個文件的指針。文件的打開與關(guān)閉文件在進(jìn)行讀寫操作之前要先打開,使用完畢要關(guān)閉。 所謂打開文件,實(shí)際上是建立文件的各種有關(guān)信息, 并使文件指針指向該文件,以便進(jìn)行其它操作。,13.2 文件的打開與關(guān)閉 對文件進(jìn)行操作之前,必須先打開該文件;使用結(jié)束后,應(yīng)立即關(guān)閉,以免數(shù)據(jù)丟失。 語言規(guī)定了標(biāo)準(zhǔn)輸入輸出函數(shù)庫,用fopen()函數(shù)打開一個文件,用fclose()函數(shù)關(guān)閉一個文件。1. 文件打開函數(shù) (1)形式:文件指針名=fopen(文件名,操作方式); (2)功能:返回一個指向指定文件的指針。 (3)函數(shù)
5、原型:stdio.h 。 注:對文件操作的庫函數(shù),函數(shù)原型均在頭文件stdio.h中。后續(xù)函數(shù)不再贅述。 例如: FILE *fp;fp=(file a,r); 其意義是在當(dāng)前目錄下打開文件file a, 只允許進(jìn)行“讀”操作,并使fp指向該文件。,(4)文件使用方式 意 義“rt” 只讀打開一個文本文件,只允許讀數(shù)據(jù)。 “wt” 只寫打開或建立一個文本文件,只允許寫數(shù)據(jù)。“at” 追加打開一個文本文件,并在文件末尾寫數(shù)據(jù)。“rb” 只讀打開一個二進(jìn)制文件,只允許讀數(shù)據(jù)?!皐b” 只寫打開或建立一個二進(jìn)制文件,只允許寫數(shù)據(jù)“ab” 追加打開一個二進(jìn)制文件,并在文件末尾寫數(shù)據(jù)“rt+” 讀寫打開
6、一個文本文件,允許讀和寫?!皐t+” 讀寫打開或建立一個文本文件,允許讀寫?!癮t+” 讀寫打開一個文本文件,允許讀,或在文件末追 加數(shù) 據(jù)?!皉b+” 讀寫打開一個二進(jìn)制文件,允許讀和寫。 “wb+” 讀寫打開或建立一個二進(jìn)制文件,允許讀和寫?!癮b+” 讀寫打開一個二進(jìn)制文件,允許讀,或在文件末 追加數(shù)據(jù)。,(5)對于文件使用方式有以下幾點(diǎn)說明:文件使用方式由r,w,a,t,b,+六個字符拼成,各字符的含義是: r(read): 讀 w(write): 寫 a(append): 追加 t(text): 文本文件,可省略不寫 b(banary): 二進(jìn)制文件 +: 讀和寫凡用“r”打開一個文
7、件時,該文件必須已經(jīng)存在, 且只能從該文件讀出。用“w”打開的文件只能向該文件寫入。 若打開的文件不存在,則以指定的文件名建立該文件,若打開的文件已經(jīng)存在,則將該文件刪去,重建一個新文件。, 若要向一個已存在的文件追加新的信息,只能用“a ”方式打開文件。但此時該文件必須是存在的,否則將會出錯。在打開一個文件時,如果出錯,fopen將返回一個空指針值NULL。在程序中可以用這一信息來判別是否完成打開文件的工作,并作相應(yīng)的處理。因此常用以下程序段打開文件:if(fp=fopen(c:hzk16,rb)=NULL)printf(nerror on open c:hzk16 file!);getch
8、(); exit(1); 這段程序的意義是,如果返回的指針為空,表示不能打開C盤根目錄下的hzk16文件,則給出提示信息“error on open c: hzk16file!”,下一行g(shù)etch()的功能是從鍵盤輸入一個字符,但不在屏幕上顯示。在這里,該行的作用是等待, 只有當(dāng)用戶從鍵盤敲任一鍵時,程序才繼續(xù)執(zhí)行, 因此用戶可利用這個等待時間閱讀出錯提示。敲鍵后執(zhí)行exit(1)退出程序。,把一個文本文件讀入內(nèi)存時,要將ASCII碼轉(zhuǎn)換成二進(jìn)制碼, 而把文件以文本方式寫入磁盤時,也要把二進(jìn)制碼轉(zhuǎn)換成ASCII碼,因此文本文件的讀寫要花費(fèi)較多的轉(zhuǎn)換時間。對二進(jìn)制文件的讀寫不存在這種轉(zhuǎn)換。標(biāo)準(zhǔn)輸
9、入文件(鍵盤),標(biāo)準(zhǔn)輸出文件(顯示器 ),標(biāo)準(zhǔn)出錯輸出(出錯信息)是由系統(tǒng)打開的,可直接使用。文件關(guān)閉函數(shù)文件一旦使用完畢,應(yīng)用關(guān)閉文件函數(shù)把文件關(guān)閉, 以避免文件的數(shù)據(jù)丟失等錯誤。,2. 文件關(guān)閉函數(shù)fclose 調(diào)用的一般形式是: fclose(文件指針); 功能:關(guān)閉“文件指針”所指向的文件。如果正常關(guān)閉了文件, 則函數(shù)返回值為;否則,返回值為非。 例如:fclose(fp); 正常完成關(guān)閉文件操作時,fclose函數(shù)返回值為0。如返回非零值則表示有錯誤發(fā)生。文件的讀寫對文件的讀和寫是最常用的文件操作。,13.3 文件的讀寫 在語言中提供了多種文件讀寫的函數(shù): 字符讀寫函數(shù) :fgetc
10、和fputc 字符串讀寫函數(shù):fgets和fputs 數(shù)據(jù)塊讀寫函數(shù):freed和fwrite 格式化讀寫函數(shù):fscanf和fprinf 下面分別予以介紹。使用以上函數(shù)都要求包含頭文件stdio.h。字符讀寫函數(shù)和字符讀寫函數(shù)是以字符(字節(jié))為單位的讀寫函數(shù)。 每次可從文件讀出或向文件寫入一個字符。,1.寫字符函數(shù)fputcfputc函數(shù)的功能是把一個字符寫入指定的文件中,函數(shù)調(diào)用的 形式為: fputc(字符量,文件指針); 其中,待寫入的字符量可以是字符常量或變量,例如:fputc(a,fp);其意義是把字符a寫入fp所指向的文件中。對于fputc函數(shù)的使用要說明幾點(diǎn):(1) 被寫入的文
11、件可以用寫、讀寫、追加方式打開,用寫或讀寫方式打開一個已存在的文件時將清除原有的文件內(nèi)容,寫入字符從文件首開始。如需保留原有文件內(nèi)容,希望寫入的字符以文件末開始存放,必須以追加方式打開文件。被寫入的文件若不存在,則創(chuàng)建該文件。(2) 每寫入一個字符,文件內(nèi)部位置指針向后移動一個字節(jié)。(3) fputc函數(shù)有一個返回值,如寫入成功則返回寫入的字符, 否則返回一個EOF。可用此來判斷寫入是否成功。,例:從鍵盤輸入一行字符,寫入一個文件, 再把該文件內(nèi)容讀出顯示在屏幕上。#includemain() FILE *fp; char ch;if(fp=fopen(string,wt+)=NULL) pr
12、intf(Cannot open file strike any key exit!); getch();exit(1);printf(input a string:n);ch=getchar();while (ch!=n) fputc(ch,fp);ch=getchar();fclose(fp); ,2. 讀字符函數(shù)fgetcfgetc函數(shù)的功能是從指定的文件中讀一個字符,函數(shù)調(diào)用的形式為: 字符變量=fgetc(文件指針); 例如:ch=fgetc(fp);其意義是從打開的文件fp中讀取一個字符并送入ch中。對于fgetc函數(shù)的使用有以下幾點(diǎn)說明:(1) 在fgetc函數(shù)調(diào)用中,讀取的文件
13、必須是以讀或讀寫方式打開的。(2) 讀取字符的結(jié)果也可以不向字符變量賦值,例如:fgetc(fp);但是讀出的字符不能保存。,(3) 在文件內(nèi)部有一個位置指針。用來指向文件的當(dāng)前讀寫字節(jié)。在文件打開時,該指針總是指向文件的第一個字節(jié)。使用fgetc 函數(shù)后, 該位置指針將向后移動一個字節(jié)。 因此可連續(xù)多次使用fgetc函數(shù),讀取多個字符。 應(yīng)注意文件指針和文件內(nèi)部的位置指針不是一回事。文件指針是指向整個文件的,須在程序中定義說明,只要不重新賦值,文件指針的值是不變的。文件內(nèi)部的位置指針用以指示文件內(nèi)部的當(dāng)前讀寫位置,每讀寫一次,該指針均向后移動,它不需在程序中定義說明,而是由系統(tǒng)自動設(shè)置的。,
14、例:讀入文件,在屏幕上輸出。#includemain() FILE *fp; char ch; if(fp=fopen(e10_1.c,rt)=NULL) printf(Cannot open file strike any key exit!); getch(); exit(1); ch=fgetc(fp); while (ch!=EOF) putchar(ch); ch=fgetc(fp); fclose(fp); ,3.數(shù)據(jù)塊讀寫函數(shù)fread和fwrite 語言還提供了用于整塊數(shù)據(jù)的讀寫函數(shù)。 可用來讀寫一組數(shù)據(jù),如一個數(shù)組元素,一個結(jié)構(gòu)變量的值等。 讀數(shù)據(jù)塊函數(shù)調(diào)用的一般形式為: f
15、read(buffer,size,count,fp); 寫數(shù)據(jù)塊函數(shù)調(diào)用的一般形式為: fwrite(buffer,size,count,fp); 其中:buffer是一個指針,在fread函數(shù)中,它表示存放輸入數(shù)據(jù)的首地址。在fwrite函數(shù)中,它表示存放輸出數(shù)據(jù)的首地址。 size 表示數(shù)據(jù)塊的字節(jié)數(shù)。count 表示要讀寫的數(shù)據(jù)塊塊數(shù)。fp 表示文件指針。 例如:fread(fa,4,5,fp); 其意義是從fp所指的文件中,每次讀4個字節(jié)(一個實(shí)數(shù))送入實(shí)數(shù)組fa中,連續(xù)讀5次,即讀5個實(shí)數(shù)到fa中。,例10.6從鍵盤輸入兩個學(xué)生數(shù)據(jù),寫入一個文件中, 再讀出這兩個學(xué)生的數(shù)據(jù)顯示在屏幕
16、上。#includestruct stuchar 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,4.格式化讀寫函數(shù)fscanf和fprintf fscanf函數(shù),fprin
17、tf函數(shù)與前面使用的scanf和printf 函數(shù)的功能相似,都是格式化讀寫函數(shù)。 兩者的區(qū)別在于 fscanf 函數(shù)和fprintf函數(shù)的讀寫對象不是鍵盤和顯示器,而是磁盤文件。這兩個函數(shù)的調(diào)用格式為: fscanf(文件指針,格式字符串,輸入表列); fprintf(文件指針,格式字符串,輸出表列); 例如: fscanf(fp,%d%s, 前面使用fread和fwrite的例子可改為用fscanf和fpringf:,#includestruct stuchar name10;int num;int age;char addr15;boya2,boyb2,*pp,*qq;main() FI
18、LE *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, ,5.字符串讀寫函數(shù)fgets和fputs(1)讀字符串函數(shù)fgets函數(shù) 函數(shù)調(diào)用的形式為: fgets(字符數(shù)組名,n,文件指針); 功能:從指定的文件中讀一個字符串到字符數(shù)組中, 其中:n是一個正整數(shù)。表示從文件中讀出的字符串不超過 n-1個字符。
19、在讀入的最后一個字符后加上串結(jié)束標(biāo)志0。 例如:fgets(str,n,fp);的意義是從fp所指的文件中讀出n-1個字 符送入字符數(shù)組str中。 對fgets函數(shù)有兩點(diǎn)說明:在讀出n-1個字符之前,如遇到了換行符或EOF,則讀出結(jié)束。 fgets函數(shù)也有返回值,其返回值是字符數(shù)組的首地址。,例:從e10_1.c文件中讀入一個含10個字符的字符串。#includemain()FILE *fp;char str11;if(fp=fopen(e10_1.c,rt)=NULL)printf(Cannot open file strike any key exit!);getch();exit(1);
20、fgets(str,11,fp);printf(%s,str);fclose(fp);,(2)寫字符串函數(shù)fputs調(diào)用形式為: fputs(字符串,文件指針) 函數(shù)的功能:向指定的文件寫入一個字符串。 其中:字符串可以是字符串常量,也可以是字符數(shù)組名, 或 指 針 變量。 例如: fputs(“abcd“,fp);其意義是把字符串“abcd”寫入fp所指的文件之中。,13.4 文件的定位 前面介紹的對文件的讀寫方式都是順序讀寫, 即讀寫文件只能從頭開始,順序讀寫各個數(shù)據(jù)。 但在實(shí)際問題中常要求只讀寫文件中某一指定的部分。 為了解決這個問題可移動文件內(nèi)部的位置指針到需要讀寫的位置,再進(jìn)行讀寫,
21、這種讀寫稱為隨機(jī)讀寫。 實(shí)現(xiàn)隨機(jī)讀寫的關(guān)鍵是要按要求移動位置指針,這稱為文件的定位。文件定位移動文件內(nèi)部位置指針的函數(shù)主要有兩個, 即 rewind 函數(shù)和fseek函數(shù)。1. rewind函數(shù) rewind函數(shù)前面已多次使用過,其調(diào)用形式為: rewind(文件指針); 它的功能是把文件內(nèi)部的位置指針移到文件首。,2.fseek函數(shù)。fseek函數(shù)用來移動文件內(nèi)部位置指針,其調(diào)用形式為: fseek(文件指針,位移量,起始點(diǎn)); 其中:“文件指針”指向被移動的文件。 “位移量”表示移動的字節(jié)數(shù),要求位移量是long型數(shù)據(jù),以便在文件長度大于64KB 時不會出錯。當(dāng)用常量表示位移量時,要求加后
22、綴“L”?!捌鹗键c(diǎn)”表示從何處開始計(jì)算位移量,規(guī)定的起始點(diǎn)有三種:文件首,當(dāng)前位置和文件尾。其表示方法如下: 起始點(diǎn) 表示符號 數(shù)字表示文件首 SEEKSET0當(dāng)前位置 SEEKCUR 1文件末尾 SEEKEND 2,例如: fseek(fp,100L,0);其意義是把位置指針移到離文件首100個字節(jié)處。還要說明的是fseek函數(shù)一般用于二進(jìn)制文件。在文本文件中由于要進(jìn)行轉(zhuǎn)換,故往往計(jì)算的位置會出現(xiàn)錯誤。文件的隨機(jī)讀寫在移動位置指針之后, 即可用前面介紹的任一種讀寫函數(shù)進(jìn)行讀寫。由于一般是讀寫一個數(shù)據(jù)據(jù)塊,因此常用fread和fwrite函數(shù)。下面用例題來說明文件的隨機(jī)讀寫。 例:在學(xué)生文件s
23、tu 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=,13.5 文件檢測函數(shù)語言中常用的文件檢測函數(shù)有以下幾個。1、文件結(jié)束檢測函數(shù)feof函數(shù)調(diào)用格式: feof(文件指針); 功能:判斷文件是否處于文件結(jié)束位置,如文件結(jié)束,則返回值為1,否則為0。2、讀寫文件出錯檢測函數(shù)ferror函數(shù)調(diào)用格式: ferror(文件指針); 功能:檢查文件在用各種輸入輸出函數(shù)進(jìn)行讀寫時是否出錯。 如ferro
24、r返回值為0表示未出錯,否則表示有錯。3、文件出錯標(biāo)志和文件結(jié)束標(biāo)志置0函數(shù)clearerr函數(shù)調(diào)用格式: clearerr(文件指針); 功能:本函數(shù)用于清除出錯標(biāo)志和文件結(jié)束標(biāo)志,使它們?yōu)?值。,附:庫文件 系統(tǒng)提供了豐富的系統(tǒng)文件,稱為庫文件,C的庫文件分為兩類,一類是擴(kuò)展名為.h的文件,稱為頭文件, 在前面的包含命令中我們已多次使用過。在.h文件中包含了常量定義、 類型定義、宏定義、函數(shù)原型以及各種編譯選擇設(shè)置等信息。另一類是函數(shù)庫,包括了各種函數(shù)的目標(biāo)代碼,供用戶在程序中調(diào)用。 通常在程序中調(diào)用一個庫函數(shù)時,要在調(diào)用之前包含該函數(shù)原型所在的.h 文件。 ALLOC.H 說明內(nèi)存管理函
25、數(shù)(分配、釋放等)。ASSERT.H 定義 assert調(diào)試宏。BIOS.H 說明調(diào)用IBMPC ROM BIOS子程序的各個函數(shù)。CONIO.H 說明調(diào)用DOS控制臺I/O子程序的各個函數(shù)。CTYPE.H 包含有關(guān)字符分類及轉(zhuǎn)換的名類信息(如 isalpha和toascii等)。,DIR.H 包含有關(guān)目錄和路徑的結(jié)構(gòu)、宏定義和函數(shù)。DOS.H 定義和說明MSDOS和8086調(diào)用的一些常量和函數(shù)。ERRON.H 定義錯誤代碼的助記符。FCNTL.H 定義在與open庫子程序連接時的符號常量。FLOAT.H 包含有關(guān)浮點(diǎn)運(yùn)算的一些參數(shù)和函數(shù)。GRAPHICS.H 說明有關(guān)圖形功能的各個函數(shù),圖形錯誤代碼的常量定義,正對不同驅(qū)動程
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 地皮投資協(xié)合同范例
- 更新造林合同范例
- 工廠鍋爐維修合同范例
- 園林燈飾合同范例
- 家庭電梯購買合同范例
- 日雜訂購合同范例
- 廈門房屋出租合同范例
- 商業(yè)車庫銷售合同范例
- 標(biāo)準(zhǔn)商用購房合同范例
- 合同范例及解釋
- TSHJX 061-2024 上海市域鐵路工程施工監(jiān)測技術(shù)規(guī)范
- 2024年井下采煤工技能競賽理論考試題庫(含答案)
- 2024-2025學(xué)年部編版(2024)七年級歷史上冊知識點(diǎn)提綱
- 天津市河北區(qū)2023-2024學(xué)年高一上學(xué)期1月期末化學(xué)試題(原卷版)
- 國家開放大學(xué)2024年(202401-202407)《2667績效與薪酬實(shí)務(wù)》期末考試真題
- 醫(yī)院事業(yè)單位招錄100題真題真解(結(jié)構(gòu)化面試)
- 培訓(xùn)機(jī)構(gòu)學(xué)校:教師管理手冊
- 39 《出師表》對比閱讀-2024-2025中考語文文言文閱讀專項(xiàng)訓(xùn)練(含答案)
- 綜合能力測試(一)附有答案
- YB-T+4190-2018工程用機(jī)編鋼絲網(wǎng)及組合體
- 簡述光纖溫度傳感器的原理及應(yīng)用
評論
0/150
提交評論