版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第十三章 文件3.1 文件概述 ■文件概念 所謂文件就是:存儲(chǔ)在外部介質(zhì)上 的信息集合。 根據(jù)存儲(chǔ)的介質(zhì)不同可分為: 磁盤文件、磁帶文件等。 根據(jù)內(nèi)容的不同可分為: 程序文件、數(shù)據(jù)文件等。,■使用文件輸入輸出的必要性 這里主要討論數(shù)據(jù)文件的輸入輸出,即如何將文件中的數(shù)據(jù)“輸入”到程序的數(shù)據(jù)結(jié)構(gòu)中,如何
2、將程序的數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)“輸出”到文件中。 以往的輸入輸出方法: 鍵盤輸入 ,屏幕輸出。 這種方法不適用于數(shù)據(jù)量大的情況。 舉例說(shuō)明:,main() { int i, a[1000]; for(i=0;i<1000;i++) scanf(“%d”,a+i); ┊ for(i=0;i<1000;i++
3、) printf(“%5d”,a[i]); },缺 點(diǎn):①可能出現(xiàn)重復(fù)輸入。②輸出的數(shù)據(jù)不能保存,不能進(jìn)一步使 用。,采用文件輸入輸出可以克服這些缺點(diǎn)。main(){ int i, a[1000]; for(i=0;i<1000;i++) scanf(“%d”,a+i); ┊ for(i=0;i<1000;i++)
4、 printf(“%5d”,a[i]);},},文件,文件,,,■ C文件分類 按在磁盤上存儲(chǔ)的形式不同,可分為: 文本文件: 以ASCII字符存放—可見、可編輯、占空間大。 二進(jìn)制文件:以二進(jìn)制形式存放—不可見、不可編輯、占空間小。 使用時(shí)可根據(jù)需要選擇。,13.2 文件類型指針 每個(gè)被使用的文件都在內(nèi)存中開辟一個(gè)區(qū),用來(lái)存放文件的有關(guān)信息(如文件名、文件狀態(tài)及文
5、件當(dāng)前位置等)。這些信息保存在一個(gè)FILE類型的結(jié)構(gòu)體變量中。 若 FILE *fp; 則fp就稱為指向文件類型的指針變量。訪問(wèn)文件通過(guò)文件指針進(jìn)行。,FILE結(jié)構(gòu)體類型是由系統(tǒng)定義的。具體定義如下:見P331-332 typedef struct { short level; 緩沖區(qū)“滿”或“空”的程度 unsigned fl
6、ags; 文件狀態(tài)標(biāo)志 char fd; 文件描述符 unsigned char hold; 如無(wú)緩沖區(qū)不讀取字符 short bsize; 緩沖區(qū)的大小 unsigned char *buffer; 緩沖區(qū)的位置 unsigned char
7、 *curp; 當(dāng)前讀寫指針 unsigned istemp; 臨時(shí)文件,指示器 short token; 用于有效性檢驗(yàn) }FILE;,13.3 文件的打開與關(guān)閉 對(duì)文件的讀寫之前應(yīng)“打開”該文件。 使用結(jié)束后“關(guān)閉”此文件。 ■文件的打開(fopen 函數(shù)) 用fopen函數(shù)實(shí)現(xiàn)對(duì)文件的打
8、開。 fopen函數(shù)調(diào)用的一般形式: FILE *fp; fp=fopen(文件名,讀寫方式);,例如: fp=fopen(“a1”, ”r”); 以只讀方式打開文件a1。fopen函數(shù)返回指向a1文件的指針,即fp是指向a1文件的指針變量,往后就可以通過(guò)fp訪問(wèn)a1文件。,文件讀寫方式:見P333-334 “r” 按只讀方式打開一個(gè)文本文件
9、 “w” 按只寫方式打開一個(gè)文本文件 “a” 按追加方式打開一個(gè)文本文件 “rb” 按只讀方式打開一個(gè)二進(jìn)制文件 “wb” 按只寫方式打開一個(gè)二進(jìn)制文件 “ab” 按追加方式打開一個(gè)二進(jìn)制文件,“r+” 按讀寫方式打開一個(gè)文本文件“w+” 按讀寫方式建立一個(gè)新的文本文件“a+” 按讀寫方式
10、打開一個(gè)文本文件“rb+” 按讀寫方式打開一個(gè)二進(jìn)制文件“wb+” 按讀寫方式建立一個(gè)新的二進(jìn)制文 “ab+” 按讀寫方式打開一個(gè)二進(jìn)制文件,說(shuō)明: (1)不能用”r”方式打開一個(gè)不存在的文 件,”r”方式只讀不能寫。 (2)“w” 方式只寫不能讀,具有建立和 覆蓋功能。 (3)調(diào)用fopen函數(shù)時(shí),如果返回NULL則 表示打開不成
11、功。,■文件的關(guān)閉(fclose 函數(shù))在使用完一個(gè)文件后應(yīng)用fclose 函數(shù)關(guān) 閉文件,形式為:fclose(文件指針);如: fclose(fp); 關(guān)閉后fp不再指向該文件。,13.4 文件的讀寫 文件打開后,就可以對(duì)它進(jìn)行讀寫了。 ■文本文件的讀寫 即如何將以文本方式存放的文件輸入到程序的數(shù)據(jù)結(jié)構(gòu)中。如何將程序的數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)以文本方式輸出到文件中。 讀對(duì)象:以文本方式存放
12、的文件 寫對(duì)象:以文本方式存放的文件,用于對(duì)文本文件讀寫的函數(shù)有:見P374-377,輸入輸出函數(shù) fscanf fprintf fgetc, getc fputc, putc fgets fputs 重點(diǎn)介紹 fscanf 和 fprintf。,以例子說(shuō)明fsc
13、anf和fprintf的使用。 例:已知文本文件f1.dat中存放有100個(gè)學(xué)生的分?jǐn)?shù),要求讀入這些數(shù)據(jù),并按從高到低的順序排序后輸出到另一文件中。,#include “stdio.h”#include “stdlib.h”void sort(int *a,int n){ ……}main(){ int i,a[100];FILE *fp; fp=fopen(“f1.dat”, “r”); if
14、(fp==NULL) exit(0);,定義一個(gè)指向文件的指針變量,,打開文件,使fp指向文件f1.dat,,"E:\\fyy\\c-code\\13\\f1.dat",for(i=0;i<100;i++) fscanf(fp,”%d”,a+i); fclose(fp); sort(a,100);fp=fopen(“f1-1.dat”, “w”);
15、for(i=0;i<100;i++) fprintf(fp,”%4d”,a[i]);fclose(fp);} T13-1.c,,從fp所指的文件中讀數(shù)據(jù),,關(guān)閉fp所指的文件,,,注意:文本文件的輸入格式要與 文件中的數(shù)據(jù)格式匹配。,■二進(jìn)制文件的讀寫 即如何將以二進(jìn)制方式存放的文件輸入到程序的數(shù)據(jù)結(jié)構(gòu)中。 如何將程序的數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)以二進(jìn)制方式輸出到文件中。讀對(duì)象:以二進(jìn)制方式存放存放的文件寫對(duì)
16、象:以二進(jìn)制方式保存放的文件 讀寫函數(shù): fread fwrite getw putw,例:將前例中的排序結(jié)果改用二進(jìn)制方式輸出到文件f3.dat中。(T13-1-2.c)#include “stdio.h” #include “stdlib.h”void sort (int *a,int n){ ……}
17、main(){ int i,a[100]; FILE *fp; fp= f open(“f1.dat”, “r”); if(fp==NULL) exit(0);,for(i=0;i<100;i++) fscanf(fp,”%d”,a+i);fclose1(fp);sort(a,100);fp=fopen(“f1-2.dat”, “wb”);fwrite(a, sizeof(int), 100, fp );
18、fclose(fp);},數(shù)據(jù)的開始地址,數(shù)據(jù)的每一項(xiàng)的長(zhǎng)度,數(shù)據(jù)的項(xiàng)數(shù),文件的指針,,,,,如果要將二進(jìn)制文件f3.dat讀到數(shù)組中,則有: (T13-1-3.c),#include “stdio.h”main(){ int a[100];FILE *fp;fp=fopen(“f1-2.dat”,“rb”);if(fp==NULL) exit(0);fread(a,sizeof(int),100,fp);fc
19、lose(fp); ┊},13.5 文件的定位 文件中有一個(gè)位置指針,指向當(dāng)前讀寫位置。如果順序讀寫一個(gè)文件,每次讀寫完一個(gè)字符后,該位置指針自動(dòng)指向下一個(gè)字符位置。如果想改變這樣的規(guī)律,強(qiáng)制使位置指針指向指定位置,可以用有關(guān)函數(shù)。,■rewind函數(shù) rewind函數(shù)的作用是使位置指針重返回文件的開頭。 例:對(duì)文本文件f1.dat中的100個(gè)分?jǐn)?shù)求超過(guò)平均分的人數(shù)。 T13-2.c,#include
20、 “stdio.h”main(){ int i,a,n=0; float aver=0;FILE *fp;fp=fopen(“f1.dat”,“r”);for(i=0;i<100;i++){ fscanf(fp,”%d”,&a); aver+=a;},aver/=100;rewind(fp);for(i=0;iaver) n++;} fclose(fp); printf(“\n
21、 %d”,n);},■fseek函數(shù)和隨機(jī)讀寫 使用fseek函數(shù)可以將位置指針指向所需的位置。 fseek函數(shù)調(diào)用的一般形式: fseek(文件指針,位移量,參考點(diǎn));,以參考點(diǎn)為基準(zhǔn),向前移動(dòng)的字節(jié)數(shù),0 或 SEEK_SET 文件開始1 或 SEEK_CUR 當(dāng)前位置2 或 SEEK_END 文件末尾,,,例:如果fp是指向一個(gè)存放100個(gè)整數(shù)的二進(jìn)制文件,要讀取第50個(gè)數(shù)到變量
22、n時(shí)(T13-2-2.c) fseek(fp,sizeof(int)*(50-1),SEEK_SET); fread(&n, sizeof(int), 1,fp);,例:如果fp是指向一個(gè)存放100個(gè)整數(shù)的文本文件,并已知每個(gè)數(shù)按3位數(shù)字的定長(zhǎng)格式存放,要讀取第50個(gè)數(shù)到變量n時(shí): (T13-2-3.c) fseek ( fp, 3*(50-1), SEEK_SET );
23、 fscanf ( fp, ”%3d”, &n);若要從當(dāng)前位置跳過(guò)10個(gè)數(shù)后讀取一個(gè)數(shù): fseek ( fp, 3*10, SEEK_CUR ); fscanf ( fp, ”%3d”, &n);,例:已知文本文件f2.dat中存放有100個(gè)學(xué)生的學(xué)號(hào)、姓名和考試成績(jī);要求從鍵盤輸入任一學(xué)號(hào),檢索出相應(yīng)學(xué)生的數(shù)據(jù)。說(shuō)明:(1)文件f2.dat中每行為一個(gè)學(xué)生的數(shù)據(jù),按定長(zhǎng)格式存放,依次為:
24、學(xué)號(hào)(整數(shù),占5格)、姓名(占10格)、成績(jī)(整數(shù),占4格)。(2)按學(xué)號(hào)從小到大的順序連號(hào)存放,起始學(xué)號(hào)為1001。,#include “stdio.h”typedef struct{ int num; char name[20]; int score; }STU;main(){ int no; STU st; FILE *fp;,fp=fopen ( “
25、f2.dat” , ”r” );scanf ( “%d” , &no );fseek ( fp, (no-1001)*21, 0 );//5+10+4+2fscanf ( fp, ”%5d%10s%4d” ,&st.num ,st.name, &st.score );printf (“\n%5d%10s%4d” , st.num , st.name,
26、st.score ) ;fclose ( fp ) ;} T13-3-1.c,1001 aaa 11 1002 bbb 22 1003 ccc 33 ┊,上例的檢索方法稱為“定位檢索”。如果是非定長(zhǎng)格式,則需要用“遍歷檢索”。 f2-1.dat while ( !feof ( fp ) ) { fscanf ( fp, ”%d%s%d”, &st.
27、num, st.name, &st.score ); if ( st.num==no ) { printf ( “\n%5d%10s%4d”, st.num, st.name, st.score ); break; } } T13-3-2.c 速度慢,但不受限制,綜合例:
28、 已知文本文件f3.dat中存放有武漢市所有公民的有關(guān)性別和年齡的數(shù)據(jù),請(qǐng)編寫程序分別找出其中10名男壽星和10名女壽星,并將20名壽星的數(shù)據(jù)以文本文件的方式存入到文件f4.dat中(先男后女)。,說(shuō)明: ① 文件f3.dat中每行為一個(gè)公民的數(shù)據(jù),共有3項(xiàng),依次為:姓名(不超過(guò)10個(gè)字符)、性別(0表示男,1表示女)和年齡(整數(shù)),項(xiàng)間以空格分隔。 ② 未給出公民個(gè)數(shù),將文件中的數(shù)據(jù)讀完為止。,算法
29、思想:開辟一個(gè)存放20名壽星數(shù)據(jù)的結(jié)果表a(結(jié)構(gòu)體數(shù)組),然后逐個(gè)讀取公民數(shù)據(jù),每讀取一個(gè)就向a中“判斷插入”一個(gè),男性公民往前段插,女性公民往后段插。,讀一個(gè)公民的數(shù)據(jù)到p,讀完否?,N,Y,,,,,Wanghao 0 100Liming 0 98┊wudan 1 99xiaofang 1 95┊,男性插入,女性插入,,,壽星表a,,,,#include typedef struct
30、 { char name[10]; int sex; int age; } PEP;,插入函數(shù),將一個(gè)公民的數(shù)據(jù)插入到壽星表 從大到小void insert (PEP *x, int n, PEP t ){ int i,j; if ( t.age x[i].age) break; for ( j=n-1; j>i; j--) x[j]=x[j
31、-1]; 移位 x[i]=t; 插入},main(){ int j; PEP p,a[20]; FILE *fp; fp=fopen (“f3.dat”,”r”); if(!fp) exit(0); for (j=0;j<20;j++) a[j].age=0; while( !feof ( fp ) ) { fscanf (
32、fp, ”%s%d%d\n”, p.name, &p.sex, &p.age ); insert (a+10*p.sex,10,p); } fclose(fp);,fp=fopen(“f3-1.dat”,”w”); for(j=0;j<20;j++) fprintf(fp,”\n%15s%2d%5d”,
33、 a[j].name, a[j].sex,a[j].age ); fclose ( fp ); } T13-4.c,字符輸入輸出,標(biāo)準(zhǔn)輸入輸出putchar(ch);ch=getchar();文件輸入輸出fputc(ch,fp);? putc(ch,fp);ch=fgetc(fp);? ch=getc(fp);,字符串輸入輸出,標(biāo)準(zhǔn)輸入輸出puts(字符數(shù)組);gets(字符
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- [學(xué)習(xí)]樊媛媛c語(yǔ)言程序設(shè)計(jì)08-函數(shù)
- [學(xué)習(xí)]樊媛媛c語(yǔ)言程序設(shè)計(jì)10-指針
- [學(xué)習(xí)]樊媛媛c語(yǔ)言程序設(shè)計(jì)07-數(shù)組
- [學(xué)習(xí)]樊媛媛c語(yǔ)言程序設(shè)計(jì)06-循環(huán)控制
- [學(xué)習(xí)]樊媛媛c語(yǔ)言程序設(shè)計(jì)11-結(jié)構(gòu)體
- [學(xué)習(xí)]樊媛媛c語(yǔ)言程序設(shè)計(jì)09-編譯預(yù)處理
- 《c語(yǔ)言程序設(shè)計(jì)》
- c語(yǔ)言程序設(shè)計(jì)
- c語(yǔ)言程序設(shè)計(jì)
- c語(yǔ)言程序設(shè)計(jì)
- c語(yǔ)言程序設(shè)計(jì)
- c語(yǔ)言程序設(shè)計(jì)學(xué)習(xí)資料及答案
- c語(yǔ)言程序設(shè)計(jì)(譚浩強(qiáng))
- c語(yǔ)言程序設(shè)計(jì)教程
- c語(yǔ)言程序設(shè)計(jì)3
- c語(yǔ)言程序設(shè)計(jì)論文
- c語(yǔ)言程序設(shè)計(jì)論文
- c語(yǔ)言程序設(shè)計(jì)49295
- c語(yǔ)言程序設(shè)計(jì)論文
- c語(yǔ)言程序設(shè)計(jì)試題
評(píng)論
0/150
提交評(píng)論