




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、C文件操作主要內(nèi)容13.1 文件概述13.2 文件類型指針13.3 文件的打開與關(guān)閉13.4 文件的讀寫13.5 文件的定位13.6 習(xí)題13.1 文件的概述文件的概念指存儲在外部介質(zhì)(如磁盤等)邏輯上有聯(lián)系的數(shù)據(jù)的有序集合。分類:從用戶的角度看,分為普通文件和設(shè)備文件兩種。 按數(shù)據(jù)存儲方式,分為:文本文件和二進(jìn)制文件。13.1 文件的概述普通文件:一般指源文件、目標(biāo)文件、可執(zhí)行文件;也可以是一組待輸入處理的原始數(shù)據(jù),或者是一組輸出的結(jié)果。對于源文件、目標(biāo)文件、可執(zhí)行程序可以稱作程序文件,對輸入輸出數(shù)據(jù)可稱作數(shù)據(jù)文件。數(shù)據(jù)文件:用戶數(shù)據(jù)。如未做特殊說明,本章中的文件指的是數(shù)據(jù)文件。設(shè)備文件:是
2、指與主機相聯(lián)的各種外部設(shè)備,如顯示器、打印機、鍵盤等。在操作系統(tǒng)中,把外部設(shè)備也看作是一個文件來進(jìn)行管理,把它們的輸入、輸出等同于對磁盤文件的讀和寫。 通常把顯示器定義為標(biāo)準(zhǔn)輸出文件,在屏幕上顯示信息就是向標(biāo)準(zhǔn)輸出文件輸出信息。13.1 文件的概述文本文件:也稱為ASCII文件,這種文件在磁盤中存放時每個字符占用一個字節(jié),用于存放對應(yīng)的ASCII碼。十進(jìn)制數(shù)5678,在內(nèi)存中的存儲形式為00010110 00101110(二進(jìn)制形式),只占2個字節(jié),如果按ASCII形式輸出,則占4個字節(jié)。二進(jìn)制文件是按二進(jìn)制的編碼方式來存放文件的。13.1 文件的概述緩沖文件系統(tǒng)文件中的數(shù)據(jù)是從內(nèi)存中傳送到外
3、部介質(zhì)中的,緩沖文件系統(tǒng)自動在內(nèi)存區(qū)開辟一個緩沖區(qū),使數(shù)據(jù)輸入輸出都先放到緩沖區(qū),等緩沖區(qū)放滿時,再輸出到設(shè)備上。13.1 文件的概述非緩沖文件系統(tǒng)系統(tǒng)不自動開辟確定大小的緩沖區(qū),而是由程序員為每個文件設(shè)定一個緩沖區(qū)。新的ANSI C標(biāo)準(zhǔn)不提倡使用“非緩沖文件系統(tǒng)”。注意不要在同一個程序內(nèi)混合使用這兩種文件的處理方法。因為它們調(diào)用文件的方式不同,有可能相互干擾。由于C對文件的操作是字節(jié),所以可以每次讀/寫1個字節(jié),則讀/寫512個字節(jié)就需要512次啟動外設(shè)的讀寫操作;但是,緩沖文件系統(tǒng)先將要讀/寫的數(shù)據(jù)放入緩沖區(qū),裝滿了以后再啟動外部設(shè)備的讀/寫操作。因此,讀/寫512字節(jié),只需要啟動一次外設(shè)
4、,而不是512次。13.2 文件類型指針文件類型指針是指向描述文件信息結(jié)構(gòu)體的結(jié)構(gòu)體變量,用于文件操作。在C語言中,對普通數(shù)據(jù)文件的所有操作都必須依靠文件類型指針來完成。要想對文件進(jìn)行操作,首先必須將想要操作的數(shù)據(jù)文件與文件指針建立聯(lián)系,然后通過這些文件指針來操作相應(yīng)的文件。C語言程序可同時處理多個文件,為了對每個文件進(jìn)行有效的管理,就需要開辟一個“文件信息描述區(qū)”,記錄文件的當(dāng)前狀態(tài)(文件名、文件大小等)。該信息描述區(qū)是用一個結(jié)構(gòu)變量來命名和記錄實現(xiàn)的。該結(jié)構(gòu)變量名叫文件結(jié)構(gòu)變量。文件結(jié)構(gòu)變量的類型由系統(tǒng)定義,并取名為FILE。它通常被存放在頭文件中。13.2 文件類型指針每一個要操作的文件
5、,都必須定義一個指針變量,并使它指向該文件結(jié)構(gòu)變量,該指針叫文件類型指針。于是可通過該指針找到被操作文件的描述信息,進(jìn)而對其進(jìn)行讀寫。FILE 結(jié)構(gòu)類型的格式,各個編譯系統(tǒng)有微小的區(qū)別,大致如下:typedef struct short level; /*緩沖區(qū)“滿”或“空”的程度 */ unsigned int flags; /* 文件代號*/ char fd; /* 文件描述符*/ unsigned char hold; /* 如無緩沖區(qū)不讀取字符*/ short bsize; /*緩沖區(qū)的大小*/ unsigned char *buffer; /*數(shù)據(jù)緩沖區(qū)首地址*/ unsigned
6、char *curp; /* 指針當(dāng)前位置(下一個待處理字節(jié)地址)*/ unsigned int istemp; /* 臨時文件指示器*/ short token; /* 用于有效性檢查*/ FILE; /* 自定義的類型名*/13.2 文件類型指針定義說明文件指針格式FILE* 指針變量標(biāo)識符;例如:FILE *fp;表示fp是指向FILE結(jié)構(gòu)的指針變量,通過fp即可找存放某個文件信息的結(jié)構(gòu)變量,然后按結(jié)構(gòu)變量提供的信息找到該文件,實施對文件的操作。13.3 文件的打開與關(guān)閉C語言程序中,文件在進(jìn)行讀/寫操作之前要先打開,使用完畢要關(guān)閉。打開文件實際上是建立文件的各種有關(guān)信息,并使文件指針指
7、向該文件,以便進(jìn)行其它操作。關(guān)閉文件斷開指針與文件之間的聯(lián)系,也就禁止再對該文件進(jìn)行操作。13.3 文件的打開與關(guān)閉文件打開函數(shù)fopen函數(shù)原型FILE *fopen(char *filename,char *mode);參數(shù)說明filename:要打開的文件路徑mode :打開模式返回值若成功,返回指向被打開文件的指針若出錯,返回空指針NULL(0)13.3 文件的打開與關(guān)閉文件的打開模式打開模式描 述r只讀,打開已有文件,不能寫w只寫,創(chuàng)建或打開,覆蓋已有文件a追加,創(chuàng)建或打開,在已有文件末尾追加r+讀寫,打開已有文件w+讀寫,創(chuàng)建或打開,覆蓋已有文件a+讀寫,創(chuàng)建或打開,在已有文件末尾
8、追加t按文本方式打開 (缺省)b按二進(jìn)制方式打開13.3 文件的打開與關(guān)閉文件的打開舉例FILE *fp1, *fp2, *fp3;char filename =file3.dat; /* 以文本只讀方式打開file1 */if (!(fp1=fopen(file1, r) printf(Cannot Open This File!n); exit(0); /* 退出程序 */ fp2=fopen(C:HOMEFILE2.TXT, rb+); /* 以二進(jìn)制讀寫方式打開FILE2.TXT */fp3=fopen(filename, a+b); /* 以二進(jìn)制讀寫方式打開file3.dat */
9、13.3 文件的打開與關(guān)閉文件關(guān)閉函數(shù) (fclose)函數(shù)原型int fclose(FILE *fp);參數(shù)說明fp:要關(guān)閉的文件指針返回值若成功,返回0若出錯,返回EOF(-1)不用的文件應(yīng)必須關(guān)閉,防止數(shù)據(jù)破壞丟失13.3 文件的打開與關(guān)閉文件的關(guān)閉舉例FILE *fp;char file=D:USERSTUDENTS.DAT;if (!(fp=fopen(file, rb+) printf(Open file %s error!n, file); exit(0); . .fclose(fp);13.3 文件的打開與關(guān)閉C語言程序中,文件操作順序為:打開讀/寫關(guān)閉。文件操作程序的編寫分以
10、下幾步:定義文件指針;打開文件,并判斷是否成功打開,若打開文件失敗,程序退出運行狀態(tài);對文件進(jìn)行讀寫等操作;關(guān)閉文件。13.4 文件的讀寫文件的讀寫函數(shù)函數(shù)功能函數(shù)功能fputc輸出字符fprintf格式化輸出fgetc輸入字符fscanf格式化輸入putc輸出字符putw輸出一個字getc輸入字符getw輸入一個字fwrite輸出數(shù)據(jù)塊fputs輸出字符串fread輸入數(shù)據(jù)塊fgets輸入字符串13.4 文件的讀寫feof函數(shù)函數(shù)原型int feof(FILE *fp);參數(shù)fp:文件指針返回值若文件結(jié)束,返回非零值若文件尚未結(jié)束,返回013.4 文件的讀寫fputc/putc函數(shù)函數(shù)原型i
11、nt fputc(int c, FILE *fp);int putc(int c, FILE *fp);參數(shù)c :要輸出到文件的字符fp:文件指針返回值若成功,返回輸出的字符若失敗,返回EOF13.4 文件的讀寫fgetc/getc函數(shù)函數(shù)原型int fgetc(FILE *fp);int getc(FILE *fp);參數(shù)fp:文件指針返回值若成功,返回輸入的字符若失敗或文件結(jié)束,返回EOF13.4 文件的讀寫舉例:將file_in.txt的文件內(nèi)容讀出并寫入到file_out.txt文件中#include void main() FILE *fp1, *fp2; char c; fp1 =
12、 fopen(file_in.txt, r); fp2 = fopen(file_out.txt, w); while(!feof(fp1) c = fgetc(fp1); fputc(c, fp2); fclose(fp1); fclose(fp2);13.4 文件的讀寫fwrite和fread函數(shù)函數(shù)原型size_t fwrite(void *buffer, size_t size, size_t count, FILE *fp);size_t fread (void *buffer, size_t size, size_t count, FILE *fp);參數(shù)buffer:要讀/寫的數(shù)
13、據(jù)塊地址size :要讀/寫的每個數(shù)據(jù)項的字節(jié)數(shù)count :要讀/寫的數(shù)據(jù)項數(shù)量fp :文件指針返回值若成功,返回實際讀/寫的數(shù)據(jù)項數(shù)量若失敗,一般返回013.4 文件的讀寫fwrite和fread函數(shù)舉例#includestruct student int no,age; st;void main() int i; FILE *fp; fp=fopen(c:rr.dat,wb); for(i=0;i3;i+) scanf(%d,%d, &st.no,&st.age); fwrite(&st,sizeof(st),1,fp); fclose(fp); fp=fopen(c:rr.dat,rb
14、); while(!feof(fp) fread(&st,sizeof(st),1,fp); if(!feof(fp)printf(no:%d,age,%dn,st.no,st.age); fclose(fp);13.4 文件的讀寫fprintf和fscanf函數(shù)函數(shù)原型int fscanf(FILE *fp, char *format,address,.);int fprintf(FILE *fp,char *format,argument,.);說明與printf和scanf函數(shù)類似從文件輸入或輸出到文件13.4 文件的讀寫putw函數(shù)函數(shù)原型int putw(int w, FILE *f
15、p);參數(shù)w :要輸出到文件的整數(shù)(字)fp:文件指針返回值若成功,返回輸出的整數(shù)(字)若失敗,返回EOF13.4 文件的讀寫getw函數(shù)函數(shù)原型int getw(FILE *fp);參數(shù)fp:文件指針返回值若成功,返回輸入的整數(shù)(字)若失敗,返回EOF13.4 文件的讀寫fputs函數(shù)函數(shù)原型int fputs(char *s, FILE *fp);返回值若成功,返回輸出字符個數(shù)(或最后的字符)若失敗,返回EOF說明字符串的結(jié)束標(biāo)志0不會輸出到文件也不會在字符串末尾自動添加換行符13.4 文件的讀寫fgets函數(shù)函數(shù)原型char *fgets(char *s, int n, FILE *fp
16、);返回值若成功,返回s首地址;若失敗,返回NULL說明從fp輸入字符串到s中輸入n-1個字符,或遇到換行符或EOF為止讀完后自動在字符串末尾添加013.5 文件的定位文件位置指針位置指針指向當(dāng)前讀寫的位置每次讀寫文件,位置指針都會相應(yīng)移動可以通過相關(guān)函數(shù)強制修改位置指針相關(guān)函數(shù)rewind函數(shù)fseek函數(shù)ftell函數(shù)13.5 文件的定位正常讀寫過程中,文件指針自動下移,移到下一次應(yīng)讀寫的位置。也可以使用文件指針移動函數(shù), 人為移動文件指針:void rewind(FILE *fp) /使文件指針指向文件開頭int fseek(FILE +fp,long offset,int base); /從base移動offset個字節(jié),正值向后移,負(fù)值向前移,移動成功返回1,否則返回非0base值可選項: SEEK_SET(文件頭)SEEK_CUR(當(dāng)前指針位置)SEEK_END(文件尾)輔助函數(shù):long ftell(FILE *fp);獲得文件指針當(dāng)前位置13.5 文件的定位rewind函數(shù)函數(shù)原型void rewind(FILE *fp);參數(shù)fp:文件指針功能使文件位置指針重新返回文件開頭13.5 文件的定位fseek函數(shù)函數(shù)原型:int fseek(FILE *fp, long offset,in
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 光伏變壓器知識培訓(xùn)課件
- 2025年法制宣傳日普法知識競賽搶答題庫及答案(共80題)
- 新員工入職培訓(xùn)流程與要點
- 《藝術(shù)概論:西方繪畫藝術(shù)的發(fā)展歷程及特點》
- 共享經(jīng)濟(jì)與協(xié)作式消費作業(yè)指導(dǎo)書
- 福建省龍巖市2024-2025學(xué)年高二上學(xué)期1月期末生物學(xué)試題(含答案)
- 兒童繪本中的教育意義解讀
- 人力資源外包合作協(xié)議
- 小學(xué)生讀書筆記讀后感
- 水資源開發(fā)與保護(hù)聯(lián)合協(xié)議
- 2025年中儲糧吉林分公司招聘(74人)筆試參考題庫附帶答案詳解
- 2024年上海煙草集團(tuán)有限責(zé)任公司招聘筆試真題
- 2025年中國大唐集團(tuán)有限公司重慶分公司高校畢業(yè)生招聘筆試參考題庫附帶答案詳解
- 游戲賬號購買協(xié)議書范本
- 2024年版《輸變電工程標(biāo)準(zhǔn)工藝應(yīng)用圖冊》
- c語言期末機考(大連理工大學(xué)題庫)
- 山西曲沃(或經(jīng)洪洞縣大槐樹)遷徙蘇北魯南曹氏宗系分支
- 干部管理訪談提綱
- CQI-11審核表
- 材料小樣確認(rèn)單
- 淺談如何處理好高中有機化學(xué)在必修和選修模塊中的教學(xué)
評論
0/150
提交評論