




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
文件8.1文件概述8.2文件的打開與關(guān)閉8.3文件的讀/寫本章小結(jié)
本章要點(diǎn)
本章主要介紹文件的概念及其相關(guān)操作等內(nèi)容,其中包括用文件指針進(jìn)行文件打開、關(guān)閉和讀寫操作等。通過本章學(xué)習(xí),要求了解磁盤文件的概念和用途;掌握文件指針的概念和文件變量的定義方法;深刻理解文件的讀、寫等基本操作的實現(xiàn);熟悉文件的打開、關(guān)閉、讀、寫等函數(shù)的調(diào)用形式;掌握文件操作在程序設(shè)計中的應(yīng)用方法。
8.1文件概述
8.1.1文件的概念所謂“文件”是指一組相關(guān)數(shù)據(jù)的有序集合。這個數(shù)據(jù)集有一個名稱,叫做文件名。在前面的章節(jié)中我們已經(jīng)多次使用了文件,例如源程序文件(.c)、目標(biāo)文件(.obj)、可執(zhí)行文件(.exe)等。它們通常駐留在外部介質(zhì)(如磁盤)上,在使用時才調(diào)入內(nèi)存。下面我們從不同的角度對文件做不同的分類。
1.從用戶使用的角度看
文件可分為普通文件和設(shè)備文件兩種。
普通文件是指駐留在磁盤或其他外部介質(zhì)上的一個有序數(shù)據(jù)集,可以是源文件、目標(biāo)文件、可執(zhí)行程序,也可以是一組待輸入處理的原始數(shù)據(jù),或者是一組輸出的結(jié)果。對于源文件、目標(biāo)文件、可執(zhí)行程序,可以稱做程序文件;對于輸入輸出數(shù)據(jù),可稱做數(shù)據(jù)文件。
設(shè)備文件是指與主機(jī)相連的各種外部設(shè)備,如顯示器、打印機(jī)、鍵盤等。在操作系統(tǒng)中,把外部設(shè)備也看做是一個文件來進(jìn)行管理,把它們的輸入和輸出等同于對磁盤文件的讀和寫。通常把顯示器定義為標(biāo)準(zhǔn)輸出文件,一般情況下在屏幕上顯示有關(guān)信息就是向標(biāo)準(zhǔn)輸出文件輸出,如前面經(jīng)常使用的printf()、putchar()函數(shù)就是這類輸出。鍵盤通常被指定為標(biāo)準(zhǔn)的輸入文件,從鍵盤上輸入就意味著從標(biāo)準(zhǔn)輸入文件上輸入數(shù)據(jù),scanf()、getchar()函數(shù)就屬于這類輸入。C語言系統(tǒng)定義了5個標(biāo)準(zhǔn)設(shè)備文件可供使用,如表8-1所示。
2.從文件編碼和數(shù)據(jù)的組織方式來看
文件可分為ASCII碼文件和二進(jìn)制碼文件。
ASCII文件也稱為文本文件,這種文件在磁盤中存放時每個字符占一個字節(jié),每個字節(jié)中存放相應(yīng)字符的ASCII碼。內(nèi)存中的數(shù)據(jù)存儲時需要轉(zhuǎn)換為ASCII碼。
二進(jìn)制文件是按二進(jìn)制的編碼方式來存放文件的,內(nèi)存中的數(shù)據(jù)存儲時不需要進(jìn)行數(shù)據(jù)轉(zhuǎn)換,存儲介質(zhì)上保存的數(shù)據(jù)采用與內(nèi)存數(shù)據(jù)一致的表示形式存儲。
例如,int型數(shù)據(jù)2008的存儲形式如表8-2所示。
8.1.2文件指針
在C語言程序中,無論是一般磁盤文件還是設(shè)備文件,都可以通過文件結(jié)構(gòu)類型的數(shù)據(jù)集合進(jìn)行輸入輸出操作。文件結(jié)構(gòu)是由系統(tǒng)定義的,取名為FILE。FILE結(jié)構(gòu)是用typedef語句定義出的一種類型,并且這個結(jié)構(gòu)實現(xiàn)已經(jīng)被定義在stdio.h頭文件中,使用文件程序都需要包含“#include<stdio.h>”。
C語言中,用一個指針變量指向一個文件,這個指針稱為文件指針。通過文件指針就可對它所指的文件進(jìn)行各種操作。定義說明文件指針的一般形式為:
FILE*指針變量標(biāo)識符
其中,F(xiàn)ILE必須大寫,它實際上是在stdio.h頭文件中系統(tǒng)定義的一個新數(shù)據(jù)類型,包含文件名、文件位置等信息,可理解為一個包括了文件管理有關(guān)信息的數(shù)據(jù)結(jié)構(gòu)。在編寫程序時不必關(guān)心FILE具體結(jié)構(gòu),但在打開文件時必須先定義一個文件指針。
例如:
FILE*fp;
其中,fp是指向FILE結(jié)構(gòu)的指針變量,習(xí)慣上稱為文件指針。
8.2文件的打開與關(guān)閉
任何一個文件在使用之前都要進(jìn)行打開操作,使用之后關(guān)閉操作,這是因為操作系統(tǒng)對于同時打開的文件數(shù)目是有限制的。DOS操作系統(tǒng)中,可以在DEVICE.SYS中定義允許同時打開的文件數(shù)n(用files=n定義)。其中n為可同時打開的文件數(shù),一般n<=20。因此在使用文件前應(yīng)先打開文件,才可對其中的信息進(jìn)行存取。文件用完之后需要關(guān)閉,否則將會出現(xiàn)一些意想不到的錯誤。所以,在對磁盤文件進(jìn)行操作時,一定要養(yǎng)成“先打開,后讀寫操作,最后關(guān)閉”的習(xí)慣。
8.2.1文件的打開操作
C語言用fopen()函數(shù)來實現(xiàn)文件的打開。fopen()函數(shù)的調(diào)用方式一般為:
FILE*fp;
fp=fopen(文件名,文件使用方式);
fopen()函數(shù)中第一個形式參數(shù)可以包含路徑和文件名兩部分。
例如:
fp=fopen("c:\\tc\\in.txt","r");
第二個形式參數(shù)表示打開文件的方式。關(guān)于文件打開方式的基本字符,其含義如表8-3所示。
如果成功打開了一個文件,則fopen()函數(shù)返回文件指針,否則返回空指針(NULL),由此可判斷文件打開是否成功。
例如:
if((fp=fopen("c:\\tc\\int.txt","r"))==NULL)
{printf("Cannotopenthisfile.\n");exit(0);}
如果屏幕上顯示“Cannotopenthisfile.”,則表明打開文件出錯。出錯的常見原因是:用“r”方式打開一個不存在的文件。exit函數(shù)的作用是關(guān)閉所有文件,終止正在調(diào)用的過程。待程序員檢查出錯誤,修改后再運(yùn)行。
說明:
(1)用“w”方式打開文件時,只能從內(nèi)存向該文件輸出(寫)數(shù)據(jù),而不能從文件向內(nèi)存輸入數(shù)據(jù)。如果該文件原來不存在,則打開時按指定文件名建立一個新文件。如果原來的文件已經(jīng)存在,則打開時將文件刪空,然后重新建立一個新文件。
(2)用“a”方式打開文件時,向文件的尾部添加新數(shù)據(jù),文件中原來的數(shù)據(jù)保留,但要求文件必須存在,否則會返回出錯信息。打開文件時,文件的位置指針在文件末尾。
(3)用“r+”、“w+”、“a+”方式打開文件時,既可以輸入也可以輸出,不過三種方式是有區(qū)別的:“r+”方式要求文件必須存在;“w+”方式要求建立新文件后進(jìn)行讀寫;“a+”方式要求保留文件原有的數(shù)據(jù),進(jìn)行追加或讀操作。
(4)在用文本文件向計算機(jī)輸入時,應(yīng)將回車和換行兩個字符轉(zhuǎn)換為一個換行符;在輸出時,應(yīng)將換行符轉(zhuǎn)換為回車和換行兩個字符。在用二進(jìn)制文件時,不需進(jìn)行這種轉(zhuǎn)換,因為在內(nèi)存中的數(shù)據(jù)形式與輸出到外部文件中的數(shù)據(jù)形式完全一致,一一對應(yīng)。
選擇好打開的方式,在對文件進(jìn)行操作時必須遵守打開方式的約定,否則會出錯。例如以“r”方式打開,卻要向文件中寫入數(shù)據(jù),會導(dǎo)致程序出錯。另外要注意對原有文件的保護(hù),如果原有數(shù)據(jù)需要保留,就不能用“w”或“w+”的方式打開,否則將丟失原有的數(shù)據(jù)。
8.2.2文件的關(guān)閉操作
文件在使用完后應(yīng)該及時關(guān)閉它,以防止再被誤用?!瓣P(guān)閉”就是釋放文件指針。釋放后的文件指針變量不再指向該文件,為自由的文件指針。這種方式可以避免文件中的數(shù)據(jù)丟失。釋放指針后不能再通過該指針對原對應(yīng)的文件進(jìn)行讀寫操作,除非再次用該指針變量打開該文件。
可用fclose()函數(shù)關(guān)閉文件。fclose()函數(shù)調(diào)用的一般形式為:
fclose(文件指針);
例如:
fclose(fp);
用fopen()函數(shù)打開文件時所帶回的指針賦給了fp,現(xiàn)把該文件關(guān)閉。如果文件關(guān)閉成功,則fclose()函數(shù)返回值為0;如果關(guān)閉出錯,則返回值為EOF(-1)。這可以用ferror()函數(shù)來測試,當(dāng)然也可以根據(jù)函數(shù)的返回值自己編程判斷文件是否關(guān)閉成功。
8.3文件的讀/寫
文件的讀和寫是最常用的文件操作,C語言提供了多種文件讀/寫函數(shù):★文件字符讀/寫函數(shù):fgetc()和fputc();★文件字符串讀/寫函數(shù):fgets()和fputs();★文件格式化讀/寫函數(shù):fscanf()和fprintf()。
8.3.1文件字符讀/寫
本節(jié)所講的文件讀寫函數(shù)均是指順序讀寫,即讀寫了一條信息后,文件內(nèi)部指針自動加1。
1.字符輸入函數(shù)fgetc()
fgetc()函數(shù)用來從指定文件讀入一個字符,該文件必須是以讀或讀寫方式打開的。
fgetc()函數(shù)的調(diào)用形式為:
字符變量=fgetc(文件指針);
例如,從fp指向的文件中讀取一個字符并賦給字符變量ch,則可寫成:ch=fgetc(fp);
說明:
(1)?fgetc()為字符讀函數(shù),因此之前必須以讀或讀寫方式打開文件。
(2)若在執(zhí)行fgetc()讀字符時遇到文件結(jié)束符或出錯,則函數(shù)返回一個文件結(jié)束標(biāo)志EOF(-1)。若形參fp為標(biāo)準(zhǔn)輸入文件指針stdin,則讀文件字符函數(shù)fgetc(stdin)與終端輸入函數(shù)getchar()具有完全相同的功能。
【例8-1】在屏幕上顯示文本文件readme.txt的內(nèi)容。
2.字符輸出函數(shù)fputc()
fputc()函數(shù)用來把一個字符寫入到磁盤文件中。其一般形式為:
fputc(字符變量,文件指針);
同樣,fputc(ch,stdout)的作用是將字符變量ch的值在顯示器上輸出,與函數(shù)putchar(ch)的功能完全相同。
【例8-2】從鍵盤上輸入一行字符,寫入“test.txt”文件中。
【例8-3】編程完成將文本文件readme.txt復(fù)制到result.txt中。
8.3.2文件字符串讀/寫
1.讀文件字符串函數(shù)fgets(?)
fgets()函數(shù)用來從指定文件讀入一個字符串,該文件必須是以讀或讀寫方式打開的。fgets()函數(shù)的調(diào)用形式為:
fgets(str,n,fp);
其功能為從fp指向的文件讀取至多n-1個字符(n用來指定字符數(shù)),并把它們放到字符數(shù)組str中。在讀入之后,自動向字符串未尾加上串結(jié)束標(biāo)志'\0'。如果讀成功,則返回str數(shù)組首地址;如果失敗,則返回一個空指針。
讀取操作遇到以下情況結(jié)束:
(1)已經(jīng)讀取了n-1個字符;
(2)在讀出n-1個字符之前,當(dāng)前讀取到的字符為回車符或者文件未尾。
2.寫文件字符串函數(shù)fputs(?)
fputs()函數(shù)用來把一個字符串寫入到磁盤文件上。其一般形式為:
fputs(str,fp);
其功能為把字符串str寫入到fp所指向的文件,但字符串結(jié)束符'\0'不寫入。
【例8-4】利用字符串讀寫函數(shù)編程實現(xiàn)例8-3的功能,即將readme.txt復(fù)制到result.txt中;同時,將readme.txt文件內(nèi)容顯示在屏幕上。
8.3.3文件格式化讀/寫
fscanf()函數(shù)、fprintf()函數(shù)與前面章節(jié)介紹的scanf()函數(shù)和printf()函數(shù)的功能相似,都是格式化讀寫函數(shù)。它們的區(qū)別是scanf()函數(shù)和printf()函數(shù)讀寫的對象是鍵盤和顯示器,而fprintf()函數(shù)和fscanf()函數(shù)讀寫的對象是磁盤文件。
1.格式化輸入函數(shù)fscanf(?)
fscanf()函數(shù)調(diào)用的格式為:
fscanf(fp,格式控制串,輸入列表);
其中,fp是指向要讀取文件的文件型指針,格式控制串、輸入列表同scanf()函數(shù)。
其功能是從fp指向的文件中,按格式控制串中的控制符讀取相應(yīng)數(shù)據(jù)賦給輸入列表中對應(yīng)的變量。
例如:
fscanf(fp,"%d,%f",&a,&f);
該語句完成從指定的磁盤文件中讀取ASCII字符,并按"%d"和"%f"格式轉(zhuǎn)換成二進(jìn)制形式的數(shù)據(jù)給變量a,f。
2.格式化輸出函數(shù)fprintf()
fprintf()函數(shù)調(diào)用的格式為:
fprintf(fp,格式控制串,輸出列表);
其中,fp是指向要寫入文件的文件型指針,格式控制串、輸出列表同printf()函數(shù)。其功能是將輸出列表中的各個變量或常量,依次按格式控制串中的控制符說明的格式寫入fp指向的文件中。
【例8-5】格式化函數(shù)示例。
【例8-6】從鍵盤輸入兩個學(xué)生的學(xué)號、姓名和成績數(shù)據(jù),寫入一個文件中,再讀出這兩個學(xué)生的數(shù)據(jù)并顯示在屏幕上。
8.3.4其他相關(guān)函數(shù)
1.文件結(jié)束判斷函數(shù)feof(?)
feof()函數(shù)的調(diào)用格式為:
feof(文件指針);
feof()函數(shù)檢測文件位置指針是否到達(dá)了文件結(jié)尾,若是,則返回一個非0值,否則返回0。這個函數(shù)對二進(jìn)制文件操作特別有用,因為在二進(jìn)制文件中,文件結(jié)尾標(biāo)志EOF也是一個合法的二進(jìn)制數(shù),只通過簡單地檢查讀入字符的值來判斷文件是否結(jié)束是不行的,這樣可能會造成文件未結(jié)尾而被認(rèn)為結(jié)尾。所以,在此必須有feof()函數(shù)。
2.rewind()函數(shù)
rewind()函數(shù)的調(diào)用形式為:
rewind(文件指針);
其功能是使文件內(nèi)部的位置指針指到文件的開頭,此函數(shù)沒有返回值。
3.fseek()函數(shù)
fseek()函數(shù)的調(diào)用形式為:
fseek(fp,offset,fromwhere);
其中:
fp是文件指針。
offset為文件位置指針的位移量,指以起始位置為基準(zhǔn)值向前移動的字節(jié)數(shù)。它是一個長整型量,如果它的值為負(fù)數(shù),則表示向后移,即向文件頭方向移動。
fromwhere表示文件位置指針起始計算位置。其位置可取3種值:文件首部、當(dāng)前位置和文件尾部,實際表示時分別對應(yīng)值0、1、2,或常量SEEK_SET、SEEK_CUR、SEEK_END。
4.ftell()函數(shù)
ftell()函數(shù)的作用是得到文件中位置指針的當(dāng)前位置。如果ftell()函數(shù)返回值為-1L,則表示出錯。例如:
if(ftell(fp)==-1L)
printf("error\n");
5.文件讀寫錯誤檢測函數(shù)ferror()
在調(diào)用各種輸入輸出函數(shù)如fputc()、fgetc()、fread()、fwrite
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 主體水電合同范本
- 參數(shù)設(shè)計合同范本
- 租賃會議室合同范本
- 冬儲保價合同范本
- 轉(zhuǎn)讓精裝修房產(chǎn)合同范本
- 合同范本與格式合同區(qū)別
- 鋁合金分銷合同范本
- 吧臺轉(zhuǎn)讓合同范本
- 廠內(nèi)工程裝修合同范本
- 倉庫燈具回收合同范例
- 2023年山東化工職業(yè)學(xué)院單招綜合素質(zhì)考試筆試題庫及答案解析
- 廣東省廣州市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名明細(xì)及行政區(qū)劃代碼
- 綠化移植施工方案及技術(shù)措施
- 江蘇省三級綜合醫(yī)院評審標(biāo)準(zhǔn)實施細(xì)則2017版
- 貴州區(qū)域地質(zhì)地史概述
- 監(jiān)理大綱維修改造項目
- 中國著名的塔課件
- 邢臺市區(qū)土地級別及基準(zhǔn)地價表
- 李小建《經(jīng)濟(jì)地理學(xué)》(電子版)
- 中央空調(diào)安裝施工組織設(shè)計方案(水、多聯(lián)機(jī))
- 2022年最新蘇教版五年級下冊科學(xué)全冊教案
評論
0/150
提交評論