版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第8章 文件長(zhǎng)春理工大學(xué)計(jì)算機(jī)科學(xué)技術(shù)學(xué)院主要內(nèi)容8.1 文件的有關(guān)概念8.2 流的創(chuàng)建與撤銷8.3 文件的順序讀寫8.4 文件的隨機(jī)讀寫8.5 文件操作的出錯(cuò)檢測(cè)8.1 文件的有關(guān)概念8.1.1 文件及其分類 文件:存儲(chǔ)在外部介質(zhì)上數(shù)據(jù)的集合,是操作系統(tǒng)數(shù)據(jù)管理的單位。 程序設(shè)計(jì)有關(guān)的文件分類:源程序文件、目標(biāo)程序文件、可執(zhí)行程序文件和數(shù)據(jù)文件等。 本章主要討論數(shù)據(jù)文件,即如何將程序處理的數(shù)據(jù)組織成文件保存到外部介質(zhì)上,以及怎樣從外部介質(zhì)上讀取這些數(shù)據(jù)。使用數(shù)據(jù)文件的目的1、數(shù)據(jù)文件的改動(dòng)不引起程序的改動(dòng)程序與數(shù)據(jù)分離2、不同程序可以訪問同一數(shù)據(jù)文件中的數(shù)據(jù)數(shù)據(jù)共享3、能長(zhǎng)期保存程序運(yùn)行的中
2、間數(shù)據(jù)或結(jié)果數(shù)據(jù)8.1 文件的有關(guān)概念文件分類按文件的邏輯結(jié)構(gòu):記錄文件:由具有一定結(jié)構(gòu)的記錄組成(定長(zhǎng)和不定長(zhǎng))流式文件:由一個(gè)個(gè)字符(字節(jié))數(shù)據(jù)順序組成(語言將文件看作是由一個(gè)一個(gè)字節(jié)組成的)。按存儲(chǔ)介質(zhì):普通文件:存儲(chǔ)介質(zhì)文件(磁盤、磁帶等)設(shè)備文件:非存儲(chǔ)介質(zhì)(鍵盤、顯示器、打印機(jī)等)按數(shù)據(jù)的組織形式:文本文件: ASCII文件,每個(gè)字節(jié)存放一個(gè)字符的ASCII碼二進(jìn)制文件:數(shù)據(jù)按其在內(nèi)存中的存儲(chǔ)形式原樣存放8.1 文件的有關(guān)概念如 short型數(shù)100000010011100010000內(nèi)存存儲(chǔ)形式0010011100010000二進(jìn)制形式00 0000001100000011000
3、0ASCII形式文本文件特點(diǎn):占用空間大、速度慢、便于對(duì)字符操作二進(jìn)制文件特點(diǎn):占用空間小、速度快、便于存放中間結(jié)果8.1 文件的有關(guān)概念8.1.2 文件名 一個(gè)文件必須有一個(gè)文件名。文件名包括三部分:文件路徑、文件名主干和文件名后綴。 文件路徑表明文件的存儲(chǔ)位置。如 f:exe3file1.txt 在C語言程序中,由于反斜杠符()是作為轉(zhuǎn)義字符的起始符號(hào),因此如果想用反斜杠符時(shí)要用兩個(gè)反斜杠符表示。即要寫成 f:exe3file1.txt8.1.3 文件的位置指針與讀寫方式 為了進(jìn)行讀寫,系統(tǒng)要為每個(gè)文件設(shè)置一個(gè)位置指針,用于指向當(dāng)前的讀寫位置。 當(dāng)要進(jìn)行讀或?qū)憰r(shí),文件的位置指針的初始值為文
4、件頭。 當(dāng)要為文件追加數(shù)據(jù)時(shí),文件的位置指針指向文件尾。 在ASCII文件中,通常,每進(jìn)行一次讀或?qū)?,位置指針就自?dòng)加1,指向下一個(gè)字符位置,為下一次讀或?qū)懽鳒?zhǔn)備,形成順序讀寫方式。8.2 流的創(chuàng)建與撤銷 8.2.1 FILE類型指針 FILE類型 FILE類型指針 標(biāo)準(zhǔn)文件8.2.1 FILE類型指針FILE結(jié)構(gòu)體類型 緩沖文件系統(tǒng)為每個(gè)正使用的文件在內(nèi)存開辟文件信息區(qū)文件信息用系統(tǒng)定義的名為FILE的結(jié)構(gòu)體描述FILE定義在stdio.h中typedef struct short level; /* 緩沖區(qū)“滿”或“空”的程度 */ unsigned flags; /* 文件狀態(tài)標(biāo)志*/
5、char fd; /* 文件描述符 */ unsigned char hold; /* 如無緩沖區(qū)不讀取字符 */ short bsize; /* 緩沖區(qū)大小*/ unsigned char *buffer; /* 緩沖區(qū)的位置 */ unsigned char *curp; /* 指針,當(dāng)前的指向 */ unsigned istemp; /* 臨時(shí)文件,指示器 */ short token; /* 用于有效性檢查 */ FILE; FILE類型指針指針變量說明: FILE *fp;用法:文件打開時(shí),系統(tǒng)自動(dòng)開辟文件結(jié)構(gòu)體變量,用來存放文件的相關(guān)信息,并把該變量的指針返回來,程序通過這個(gè)指針獲
6、得文件信息,訪問文件。文件關(guān)閉后,它的文件結(jié)構(gòu)體變量被釋放。8.2.1 FILE類型指針程序數(shù)據(jù)區(qū)輸入緩沖區(qū)輸出緩沖區(qū)外部介質(zhì)文件處理方法緩沖文件系統(tǒng):高級(jí)文件系統(tǒng),系統(tǒng)自動(dòng)為正在使用的文件開辟內(nèi)存緩沖區(qū)非緩沖文件系統(tǒng):低級(jí)文件系統(tǒng),由用戶在程序中為每個(gè)文件設(shè)定緩沖區(qū)緩沖文件系統(tǒng):8.2.2 流 建立了與文件相應(yīng)的流,與該文件相應(yīng)的文件結(jié)構(gòu)體變量(即文件的信息區(qū))才會(huì)有具體的值,F(xiàn)ILE類型的指針也就會(huì)指向相應(yīng)的文件的結(jié)構(gòu)體變量。文件1的信息區(qū)fp1文件2的信息區(qū)fp2文件3的信息區(qū)fp38.2.2 流C文件操作用庫函數(shù)實(shí)現(xiàn),包含在stdio.h文件使用方式:打開文件-文件讀/寫-關(guān)閉文件8.
7、2.3 文件的打開與關(guān)閉流的創(chuàng)建與撤銷8.2.3 文件的打開與關(guān)閉流的創(chuàng)建與撤銷1. 文件的打開 fopen (文件名,文件操作方式);功能:按指定方式打開文件返回值:正常打開,返回一個(gè)FILE類型的指針值;打開失敗,為NULL值。操作方式操作方式符號(hào)對(duì)文本文件對(duì)二進(jìn)制文件讀打開rrb寫生成wwb追加aab讀寫打開r+rb+/r+b讀寫生成w+wb+/w+b讀寫追加a+ab+/a+b8.2.3 文件的打開與關(guān)閉流的創(chuàng)建與撤銷文件操作方式例 文件打開與測(cè)試 FILE *fp; fp=fopen(“aa.c”,“w”); if(fp=NULL) printf(“File open error!n”
8、); exit(0); 例 FILE *fp; char *filename=“test.dat” fp= fopen(filename,”r”); 例 FILE *fp; fp= fopen (“test.dat”, “r”); 8.2.3 文件的打開與關(guān)閉流的創(chuàng)建與撤銷2. 文件的關(guān)閉 fclose(文件指針變量)功能:關(guān)閉fp指向的文件返值:正常關(guān)閉為0;出錯(cuò)時(shí),非0作用:使文件指針變量與文件“脫鉤”,釋放文件結(jié)構(gòu)體變量,指針變量也不再指向該文件。例如: FILE *fp; fp=fopen(data.c,r); fclose(fp);/*關(guān)閉fp所指向的文件*/8.2.3 文件的打開與
9、關(guān)閉流的創(chuàng)建與撤銷8.3 文件的順序讀寫8.3.1 文件的字符讀寫8.3.2 文件的字符串讀寫8.3.3 文件的格式化讀寫8.3.4 文件的記錄讀寫8.3.1 文件的字符讀寫 fputc調(diào)用方式: fputc( ch, fp)功能:把ch中一個(gè)字符寫入fp指向的文件中返值:正常,返回所寫字符;出錯(cuò),為EOF(-1)fgetc調(diào)用方式: fgetc(fp)功能:從fp指向的文件中讀取一個(gè)字符返值:正常,返回讀取的字符;讀到文件尾或出錯(cuò),為EOF8.3.1 文件的字符讀寫#include #include int main(void)FILE *fp;int ch;if (fp=fopen(“f:
10、C3exfile1.txt”,”w”)=NULL)printf(“cannot open this file.n”);exit(1);while (ch=getchar()!=n)fputc(ch,fp);fclose(fp); return 0;運(yùn)行情況如下,當(dāng)鍵入: I love China.時(shí),這些字符將逐個(gè)被輸出到磁盤文件file1.txt中。例8.18.3.1 文件的字符讀寫#include #include int main(void)FILE *fp;char ch;if ( fp=fopen(“f:C3exfile1.txt”,”r”)=NULL) printf(“cannot
11、 open this file.n”); exit(1); while ( ch=fgetc(fp)!=EOF) putchar(ch);fclose(fp);return 0;程序運(yùn)行顯示如下結(jié)果:I love China.例8.2while (!feof(fp) ch=fgetc(fp); putchar(ch);fgets(s, n,fp)fputs(s,fp)功能:從fp指向的文件讀/寫一個(gè)字符串返值:fgets正常時(shí)返回讀取字符串的首地址;出錯(cuò)或文件尾,返回NULLfputs正常時(shí)返回非負(fù)值;出錯(cuò)為EOFfgets從fp所指文件讀n-1個(gè)字符送入s指向的內(nèi)存區(qū),并在最后加一個(gè)0(若讀
12、入n-1個(gè)字符前遇換行符或文件尾(EOF)即結(jié)束)調(diào)用方式:fputs把s指向的字符串寫入fp指向的文件fputs(china,fp);fgets(str,n,fp);8.3.2 文件的字符串讀寫8.3.2 文件的字符串讀寫#include #include #include int main(void)FILE *fp;char string81;if (fp=fopen(“f:C3exefile2.txt”,”w”)=NULL) printf(“cant open file”);exit(1); while (strlen (gets(string)0) fputs(string, fp)
13、;fputs(“n“,fp);fclose(fp);return 0;例8.5fscanf(文件指針,格式字符串,地址表);fprintf(文件指針,格式字符串,輸出表);功能:按格式對(duì)文件進(jìn)行I/O操作返值:成功,返回I/O的個(gè)數(shù);出錯(cuò)或文件尾,返回EOF例 fprintf(fp,“%d,%6.2f”,i,t); /將i和t按%d,%6.2f格式輸出到fp文件 fscanf(fp,“%d,%f”,&i,&t); /若文件中有3,4.5 ,則將3送入i, 4.5送入t調(diào)用方式:8.3.3 文件的格式化讀寫#include #include #include int main(void)FILE
14、 * fp;char name20;int num;float score;if (fp=fopen(“f:C3exefile3.txt”,”w”)=NULL)printf(“cant open file”);exit(1); 8.3.3 文件的格式化讀寫例8.6printf(“type name,num,score:”);scanf(“%s %d %f”,name,&num,&score);while (strlen (name)1)fprintf(fp,“%s %d %f”,name, num, score);printf(“type name, num, score:”); scanf(
15、“%s %d %f”,name, &num, &score);fclose (fp);return 0;8.3.3 文件的格式化讀寫將數(shù)據(jù)文件file3.txt的數(shù)據(jù)讀回程序并輸出到屏幕上#include #include int main()FILE *fp;char name20;int num;float score;if (fp=fopen(“f:c3exefile3.txt”,”r”)=NULL) printf(“cant open file”); exit(1); while (fscanf(fp, “%s %d %f”,name, &num, &score)!=EOF)print
16、f(“%-20s %6d %6.2fn”, name, num, score);fclose (fp);return 0;8.3.3 文件的格式化讀寫8.3.4 文件的記錄讀寫fread(buffer, size, count, fp);fwrite(buffer, size, count, fp);功能:讀/寫數(shù)據(jù)塊返值:成功,返回讀/寫的塊數(shù);出錯(cuò)或文件尾,返回0說明:用法:fp-文件指針。buffer-是一個(gè)指針。對(duì)fread來說,是讀入數(shù)據(jù)存放地址, 對(duì)fwrite來說,是輸出數(shù)據(jù)的地址。size-數(shù)據(jù)塊的字節(jié)數(shù)。count-要讀寫多少個(gè)size字節(jié)的數(shù)據(jù)塊。例 float f2; F
17、ILE *fp; fp=fopen(“aa.dat”,“rb”); fread(f,4,2,fp);for(i=0;i2;i+) fread(&fi,4,1,fp);例 struct student int num; char name20; char sex; int age; float score3; stud10; for(i=0;i0 前進(jìn)移動(dòng)0 后退移動(dòng)起始點(diǎn)文件開始 SEEK_SET 0文件當(dāng)前位置 SEEK_CUR 1文件末尾 SEEK_END 2例 fseek(fp,100L,0); fseek(fp,50L,1); fseek(fp,-10L,2); 8.4.1 文件位置指
18、針的定位2. ftell函數(shù)用法:fell(文件指針);功能:返回位置指針當(dāng)前位置(用相對(duì)文件開頭的位移量表示)返值:成功,返回當(dāng)前位置指針位置;失敗,返回-1L。8.4.1 文件位置指針的定位3. rewind函數(shù)用法: rewind(文件指針);功能:重置文件位置指針到文件開頭8.4.1 文件位置指針的定位例 對(duì)一個(gè)磁盤文件進(jìn)行顯示和復(fù)制兩次操作#include main() FILE *fp1,*fp2; fp1=fopen(“file1.c,r); fp2=fopen(“file2.c,w); while(!feof(fp1) putchar(fgetc(fp1); rewind(fp
19、1); while(!feof(fp1) fputc(fgetc(fp1),fp2); fclose(fp1); fclose(fp2);8.4.1 文件位置指針的定位8.4.2 文件隨機(jī)讀寫程序舉例例:求文件長(zhǎng)度#includestdio.h main() FILE *fp; long length; fp=fopen(“e:wanga.txt”,r); if(fp=NULL) printf(file not found!n); else fseek(fp,0L,SEEK_END); length=ftell(fp); printf(Length of File is %1d bytesn,
20、length); fclose(fp); 以下程序的功能是( )。#includemain() FILE *fp; fp=fopen(“abc.txt, r+); while(!feof(fp) if(fgetc(fp)=*) fseek(fp,-1L,SEEK_CUR); fputc($,fp); fseek(fp,ftell(fp),SEEK_SET); fclose(fp);A. 將abc文件中所有*替換為$ B. 查找abc文件中所有*C. 查找abc文件中所有$ D. 將abc文件中所有字符替換為$A練習(xí)題. 下面的程序執(zhí)行后,文件testxt.t中的內(nèi)容是( )。 #include
21、 void fun(char *fname,char *st) FILE *myf; int i; myf=fopen(fname,w ); for(i=0;istrlen(st); i+) fputc(sti,myf); fclose(myf); main() fun(test.txt,new world); fun(test.txt,hello,); A. hello, B. new worldhello, C. new world D. hello, rldA用W方式:如果原來不存在該文件,則打開時(shí)新建一個(gè)文件,如果原來已經(jīng)存在,則打開時(shí)將該文件刪除,重新建立一個(gè)文件.程序運(yùn)行后的輸出結(jié)果是( )。#include main() FILE *fp; int i=20,j=30,k,n; fp=fopen(d1.dat, w); fprintf(fp, %dn,i); fprin
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 深孔注漿方案(改)
- DB37 1228-2009建筑物防雷裝置施工與驗(yàn)收規(guī)范
- 軟件銷售服務(wù)合同書
- 項(xiàng)目勞務(wù)分包協(xié)議
- 軟件維護(hù)流程優(yōu)化合同
- 質(zhì)押合同解除協(xié)議示例
- 學(xué)生全面發(fā)展承諾保證書
- 重慶市標(biāo)準(zhǔn)二手房買賣合同
- 房屋買賣合同規(guī)范化的必要性
- 房屋買賣合同與租賃合同的關(guān)系
- 人教版九年級(jí)道法全冊(cè)易混易錯(cuò)知識(shí)點(diǎn)(二)
- 山西省建筑消防設(shè)施維護(hù)保養(yǎng)規(guī)程 DB14T2489-2022知識(shí)培訓(xùn)
- 2024年環(huán)保知識(shí)生態(tài)建設(shè)知識(shí)競(jìng)賽-人工環(huán)境工程學(xué)科獎(jiǎng)學(xué)金(人環(huán)獎(jiǎng))知識(shí)競(jìng)賽考試近5年真題附答案
- 基礎(chǔ)會(huì)計(jì)學(xué)試題庫及其參考答案 (一)
- 01SS105給排水常用儀表及特種閥門安裝圖集
- 人教部編統(tǒng)編版初中八年級(jí)語文下學(xué)期全冊(cè)單元測(cè)試卷(1-6單元全含期中期末及答案解析)
- 2024秋期國(guó)家開放大學(xué)《城市管理學(xué)》一平臺(tái)在線形考(任務(wù)1至4)試題及答案
- GB/T 44592-2024紅樹林生態(tài)保護(hù)修復(fù)技術(shù)規(guī)程
- 2024年山東青島局屬高中自主招生化學(xué)試題(含答案)
- 朝陽區(qū)六年級(jí)上學(xué)期語文期末試卷
- 人教A版(2019)高中數(shù)學(xué)選擇性必修第二冊(cè) 《數(shù)列的相關(guān)概念》教學(xué)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論