版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第 9 章 文件,概 述,C語(yǔ)言本身沒(méi)有為文件提供一種基本數(shù)據(jù)類(lèi)型,而是提供了一種構(gòu)造類(lèi)型FILE。這種類(lèi)型是在標(biāo)準(zhǔn)輸入輸出庫(kù)文件stdio.h中定義的,使用起來(lái)非常方便和有效??傮w上說(shuō),C語(yǔ)言通過(guò)定義一套標(biāo)準(zhǔn)輸入輸出庫(kù)函數(shù),來(lái)完成對(duì)文件的操作。 本章介紹C文件的概念,文件指針及定義形式,文件打開(kāi)、關(guān)閉方式,文件讀寫(xiě)的含義及簡(jiǎn)單操作。更多的內(nèi)容可參閱相關(guān)書(shū)籍。,1. 文件指針的定義。 2. 文件打開(kāi)和關(guān)閉的方法。 3. 文件讀寫(xiě)的簡(jiǎn)單操作。,考核內(nèi)容,9.1 C語(yǔ)言的文件概念,文件是程序設(shè)計(jì)中的重要概念。一般來(lái)說(shuō),文件是邏輯上具有完整意義的信息的集合。例如,程序文件是程序代碼的集合,數(shù)據(jù)文件是
2、處理數(shù)據(jù)的集合。文件的物理存儲(chǔ)位置是外部存儲(chǔ)設(shè)備,例如硬盤(pán)、軟盤(pán)、磁帶、屏幕等。對(duì)文件的處理過(guò)程就是對(duì)文件的讀寫(xiě)過(guò)程或輸入輸出過(guò)程。,C語(yǔ)言對(duì)文件的處理是通過(guò)標(biāo)準(zhǔn)函數(shù)庫(kù)中的輸入輸出函數(shù)來(lái)實(shí)現(xiàn)的。在C語(yǔ)言中,所有的外部設(shè)備均被視為文件對(duì)待,這種文件稱(chēng)為設(shè)備文件。在表示外部設(shè)備的設(shè)備文件中,有三個(gè)特殊文件,它們是由系統(tǒng)分配和控制的,稱(chēng)為標(biāo)準(zhǔn)設(shè)備文件,它們是: 1. 標(biāo)準(zhǔn)輸入文件:系統(tǒng)分配為鍵盤(pán)。 2. 標(biāo)準(zhǔn)輸出文件:系統(tǒng)分配為顯示器。 3. 標(biāo)準(zhǔn)錯(cuò)誤輸出文件:系統(tǒng)分配為顯示器。,9.1 C語(yǔ)言的文件概念,C語(yǔ)言把文件看作是字符(或字節(jié))序列,即文件是由一個(gè)個(gè)字符(或字節(jié))數(shù)據(jù)順序組成。如果文件是由
3、一個(gè)個(gè)字符數(shù)據(jù)組成,則稱(chēng)之為文本文件;如果是由一個(gè)個(gè)字節(jié)數(shù)據(jù)組成,則稱(chēng)之為二進(jìn)制文件。所以C語(yǔ)言文件是一個(gè)個(gè)字符流或二進(jìn)制流(這里的流可理解為序列之意),也就是說(shuō)它是由一串字符(或字節(jié))所組成,而不是由記錄所組成。因此,C語(yǔ)言文件也叫流式文件。流式文件允許對(duì)一個(gè)字符(或字節(jié))進(jìn)行存取,這在很大程度上增加了對(duì)數(shù)據(jù)處理的靈活性。,9.1 C語(yǔ)言的文件概念,在C語(yǔ)言的過(guò)去版本中,有兩種對(duì)文件的處理方法,一種叫“緩沖文件系統(tǒng)”,另一種叫“非緩沖文件系統(tǒng)”。“緩沖文件系統(tǒng)”是指系統(tǒng)為這類(lèi)文件自動(dòng)在內(nèi)存區(qū)開(kāi)辟一個(gè)確定大小的緩沖區(qū),使輸入輸出都先通過(guò)緩沖區(qū)過(guò)渡,以提高效率。“非緩沖文件系統(tǒng)”是系統(tǒng)不自動(dòng)開(kāi)辟
4、確定大小的緩沖區(qū),而是由程序?yàn)槊總€(gè)文件設(shè)定一個(gè)緩沖區(qū),但目前的ANSI C 不提倡使用“非緩沖文件系統(tǒng)”。,9.1 C語(yǔ)言的文件概念,9.2 C語(yǔ)言文件類(lèi)型指針,文件類(lèi)型指針是“緩沖文件系統(tǒng)”的一個(gè)重要概念,實(shí)際上是一個(gè)指向結(jié)構(gòu)體類(lèi)型的指針變量。C語(yǔ)言程序可同時(shí)處理多個(gè)文件,為了對(duì)每個(gè)文件進(jìn)行有效的管理,就需要為其開(kāi)辟一個(gè)“文件信息描述區(qū)”,以記錄文件的當(dāng)前狀態(tài)(例如文件名、文件狀態(tài)、當(dāng)前存取的字符位置等)。該信息描述區(qū)是用一個(gè)結(jié)構(gòu)體變量來(lái)表達(dá)的,該結(jié)構(gòu)體變量的類(lèi)型由系統(tǒng)定義,并取名為FILE。通常它被存放在 頭文件中。,對(duì)于每一個(gè)要操作的文件,都必須定義一個(gè)指針變量,并使它指向該文件的結(jié)構(gòu)體
5、變量,該指針叫文件類(lèi)型指針,簡(jiǎn)稱(chēng)文件指針。一旦為某個(gè)文件定義了文件指針后,就可通過(guò)該文件指針找到被操作文件的描述信息,進(jìn)而對(duì)其進(jìn)行操作。定義文件類(lèi)型指針的一般形式為: FILE *文件指針變量名 例如: FILE *fp1,*fp2; fp1和fp2被定義為指向文件類(lèi)型的指針變量,即文件指針。,9.2 C語(yǔ)言文件類(lèi)型指針,9.3 文件的打開(kāi)與關(guān)閉,9.3.1 文件打開(kāi),在C語(yǔ)言中,打開(kāi)文件用函數(shù)“fopen”。 “fopen”函數(shù)的調(diào)用方式通常為: FILE *fp; fp= fopen(“文件名”,“文件使用方式”); 例如有下列語(yǔ)句: FILE *fp1; fp1=fopen(“c:fil
6、e1.dat”,“r”); 該語(yǔ)句表示以只讀方式打開(kāi)C盤(pán)根目錄上的文件“file1.dat”。,下表是C語(yǔ)言文件的使用方式、含義及功能,9.3.1 文件打開(kāi),注意: 1.用“r”或“rb”方式只能打開(kāi)一個(gè)已存在的文件,且只能讀該文件的內(nèi)容,不能改寫(xiě)該文件。 2.用“w”或“wb” 或“w+” 或“wb+”方式只能用于新建一個(gè)文件,若該文件已經(jīng)存在,則覆蓋該文件。 3.若正確執(zhí)行fopen函數(shù),則函數(shù)返回一個(gè)非空指針值,否則返回空指針NULL。因此用fopen函數(shù)打開(kāi)一個(gè)文件時(shí),一般情況下都要對(duì)函數(shù)返回值進(jìn)行檢查,以判斷文件是否正常打開(kāi)。,9.3.1 文件打開(kāi),在程序中,文件處理完畢后必須要關(guān)閉
7、,否則可能造成文件數(shù)據(jù)丟失等問(wèn)題。在C語(yǔ)言中,關(guān)閉文件要用到文件關(guān)閉函數(shù)“fclose”,該函數(shù)的調(diào)用方式通常為: fclose(文件指針); 例如:fclose(fp1);就是關(guān)閉文件指針fp1所指向的文件,亦即讓fp1解除與所指向的文件的聯(lián)系,并在解除這種聯(lián)系之前進(jìn)行文件的善后處理(如把緩沖區(qū)數(shù)據(jù)寫(xiě)入文件等)。,9.3.2 文件關(guān)閉,9.4 文件的讀寫(xiě),9.4.1 文件讀寫(xiě)的含義,1. 文件的讀操作 就是將一個(gè)已經(jīng)打開(kāi)的文件的內(nèi)容讀取出來(lái)。通常是在文件的當(dāng)前位置處讀出一部分?jǐn)?shù)據(jù),并將其賦給一個(gè)對(duì)應(yīng)的變量。文件剛打開(kāi)時(shí),其位置指針指向文件的開(kāi)頭。當(dāng)進(jìn)行讀操作時(shí),總是從文件位置指針?biāo)肝恢瞄_(kāi)始
8、,去讀后面的數(shù)據(jù),然后文件位置指針移到尚未讀取的位置之前,以備下一次的讀寫(xiě)操作。讀操作只會(huì)影響文件的位置指針,而不會(huì)修改文件的內(nèi)容。,9.4.1 文件讀寫(xiě)的含義,2.文件的寫(xiě)操作 就是將一些數(shù)據(jù)寫(xiě)入(有時(shí)也稱(chēng)存入或輸出)到某個(gè)文件中。該文件可以是一個(gè)已經(jīng)存在的文件,也可以是一個(gè)新建的文件。每次寫(xiě)操作都是將某些數(shù)據(jù)從文件的位置指針處開(kāi)始寫(xiě)入,寫(xiě)操作完畢后,文件位置指針自動(dòng)移到下一個(gè)寫(xiě)入位置。寫(xiě)操作不僅會(huì)影響文件的位置指針,還會(huì)修改文件的內(nèi)容。,9.4.1 文件讀寫(xiě)的含義,下表是常見(jiàn)的讀寫(xiě)函數(shù),9.4.1 文件讀寫(xiě)的含義 注意:,1.原則上,fputc和fgetc、fputs和fgets、fwri
9、te 和fread、 fprintf 和fscanf應(yīng)配對(duì)使用。此處“配對(duì)”意思是如果用了fgetc從一個(gè)文件中讀取了單個(gè)數(shù)據(jù),則當(dāng)向其寫(xiě)入單個(gè)數(shù)據(jù)時(shí),應(yīng)該用fputc,而不用其它寫(xiě)函數(shù)。其余幾對(duì)函數(shù)以此類(lèi)推。 2.調(diào)用fputs或fprintf若成功,則返回非0值,否則返回0值。,9.4.1 文件讀寫(xiě)的含義 注意:,3.fgetc函數(shù)用于從文本文件中讀取單個(gè)字符,該函數(shù)返回讀取的字符。若讀取失敗,則返回EOF(即-1)。fputc函數(shù)若調(diào)用成功,返回要寫(xiě)入的字符,否則返回EOF。 4、若文件以二進(jìn)制形式打開(kāi),用fread和fwrite函數(shù)可以讀寫(xiě)任何類(lèi)型的數(shù)據(jù)。這兩個(gè)函數(shù)若調(diào)用成功,則返回?cái)?shù)
10、據(jù)的“個(gè)數(shù)”值。 個(gè)數(shù)=讀寫(xiě)數(shù)據(jù)的長(zhǎng)度每個(gè)數(shù)據(jù)占據(jù)的字節(jié)數(shù),9.4.2 文件讀寫(xiě)操作例子,【例9-1】 把從鍵盤(pán)輸入的文本按原樣寫(xiě)入到名為example1.dat的磁盤(pán)文件中,用字符“#”作為輸入結(jié)束標(biāo)志。,#include main() FILE *fp1; char ch; if(fp1=fopen(“example1.dat”,“w”)=NULL) printf(“Cant open the file!n”); exit(1); printf(“請(qǐng)輸入字符:n”); ch=getchar(); while(ch!=#) fputc(ch,fp1); ch=getchar(); fclos
11、e(fp1); ,【例9-2】 將上例中example1.dat中的內(nèi)容,原樣輸出到屏幕上。,#include main() FILE *fp1; char ch; if(fp1=fopen(“example1.dat”,“r”)=NULL) printf(“Cant open the file!n”); exit(1); ch=fgetc(fp1); while(ch!=EOF) putchar(ch); ch=fgetc(fp1); fclose(fp1); ,本章小結(jié),1.C語(yǔ)言中文件被看作字符(字節(jié))序列,稱(chēng)為流式文件,C文件可分為文本文件和二進(jìn)制文件兩類(lèi)。C語(yǔ)言本身并沒(méi)有為文件提供一
12、種基本數(shù)據(jù)類(lèi)型,而是提供了一種構(gòu)造類(lèi)型FILE。在C語(yǔ)言的過(guò)去版本中,有兩種對(duì)文件的處理方法,一種叫“緩沖文件系統(tǒng)”,另一種叫“非緩沖文件系統(tǒng)”,但目前的ANSI C 不提倡使用“非緩沖文件系統(tǒng)”。,2.在C語(yǔ)言中,對(duì)于每一個(gè)要操作的文件,都必須為其定義一個(gè)文件指針,并讓這個(gè)文件指針指向要操作的文件。文件指針的定義形式為: FILE *文件指針變量名 3.C語(yǔ)言對(duì)文件的操作都是由庫(kù)函數(shù)實(shí)現(xiàn)的,因此,在調(diào)用這些函數(shù)時(shí),應(yīng)在程序開(kāi)頭包含文件stdio.h。而且要使用文件時(shí),必須將其打開(kāi);使用完后,必須將其關(guān)閉。,本章小結(jié),4.文件的讀操作,就是將一個(gè)已經(jīng)打開(kāi)的文件的內(nèi)容讀取出來(lái)(有時(shí)也稱(chēng)輸入或取出)。通常是在文件的當(dāng)前位置處讀出一部分?jǐn)?shù)據(jù),并將其賦給一個(gè)對(duì)應(yīng)的變量。讀操作只會(huì)影響文件的位置
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東省廣州市海珠區(qū)2025-2026學(xué)年高一(上)期末物理模擬試卷(含答案)
- 北京市海淀區(qū)2025-2026學(xué)年高三上學(xué)期期末考試物理試卷(含答案)
- 安徽省合肥市科大附中2025-2026學(xué)年九年級(jí)(上)期末化學(xué)試卷(含答案)
- 2025-2026學(xué)年上海市浦東新區(qū)七年級(jí)(上)期末歷史試卷(含答案)
- 五下試卷及答案數(shù)學(xué)
- 網(wǎng)絡(luò)管理專(zhuān)業(yè)題庫(kù)及答案
- 2024年北師大版小學(xué)三年級(jí)上冊(cè)數(shù)學(xué)期末測(cè)試題及答案
- 酒吧策劃方案4篇
- 憑祥2022年事業(yè)單位招聘考試模擬試題及答案解析16
- 電氣更新改造技術(shù)要點(diǎn)
- 2026年小學(xué)說(shuō)明文說(shuō)明方法判斷練習(xí)題含答案
- 中國(guó)監(jiān)控管理制度規(guī)范
- 2026年工程法律顧問(wèn)高級(jí)面試含答案
- 2026年醫(yī)療器械不良事件分析報(bào)告
- 通信網(wǎng)絡(luò)設(shè)備安裝與調(diào)試指南(標(biāo)準(zhǔn)版)
- 二年級(jí)??级鄨D版看圖寫(xiě)話(huà)專(zhuān)項(xiàng)訓(xùn)練29篇(含范文)
- 風(fēng)電場(chǎng)運(yùn)維安全責(zé)任書(shū)2025年版
- 浙江省杭州市上城區(qū)2024-2025學(xué)年七年級(jí)上學(xué)期語(yǔ)文1月期末試卷(含答案)
- 基于機(jī)器視覺(jué)的SLM金屬3D打印設(shè)備視覺(jué)標(biāo)定技術(shù)研究
- CJ/T 192-2017內(nèi)襯不銹鋼復(fù)合鋼管
- 2025年馬口鐵印鐵制罐項(xiàng)目可行性研究報(bào)告
評(píng)論
0/150
提交評(píng)論