




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第十三章 文件 3.1 文件概述 文件概念 所謂文件就是:存儲在外部介質(zhì)上 的信息集合。 根據(jù)存儲的介質(zhì)不同可分為: 磁盤文件、磁帶文件等。 根據(jù)內(nèi)容的不同可分為: 程序文件、數(shù)據(jù)文件等。,使用文件輸入輸出的必要性 這里主要討論數(shù)據(jù)文件的輸入輸出,即如何將文件中的數(shù)據(jù)“輸入”到程序的數(shù)據(jù)結(jié)構(gòu)中,如何將程序的數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)“輸出”到文件中。 以往的輸入輸出方法: 鍵盤輸入 ,屏幕輸出。 這種方法不適用于數(shù)據(jù)量大的情況。,鍵盤輸入和屏幕輸出例:main() int i, a1000; for(i=0;i1000;i+) scanf(“%d”,a+i); for(i=0;i1000;i+) pri
2、ntf(“%5d”,ai); ,缺 點(diǎn): 可能出現(xiàn)重復(fù)輸入。 輸出的數(shù)據(jù)不能保存,不便于進(jìn)一步使 用。,采用文件輸入輸出可以克服這些缺點(diǎn)。 main() int i, a1000; for(i=0;i1000;i+) scanf(“%d”,a+i); for(i=0;i1000;i+) printf(“%5d”,ai); ,文件,文件, C文件分類 按在磁盤上存儲的形式不同,可分為: 文本文件: 以ASCII字符存放可見、可編輯、占空間大。 二進(jìn)制文件:以二進(jìn)制形式存放不可見、不可編輯、占空間小。 使用時可根據(jù)需要選擇。,13.2 文件類型指針 每個被使用的文件都在內(nèi)存中開辟一個區(qū),用來存放文
3、件的有關(guān)信息。這些信息保存在一個FILE類型的結(jié)構(gòu)體變量中。 若 FILE *fp; 則fp就稱為指向文件類型的指針變量。訪問文件通過文件指針進(jìn)行。,FILE結(jié)構(gòu)體類型是由系統(tǒng)定義的。 具體定義如下: typedef struct short level; 緩沖區(qū)“滿”或“空”的程度 unsigned flags; 文件狀態(tài)標(biāo)志 char fd; 文件描述符 unsigned char hold; 如無緩沖區(qū)不讀取字符 short bsize; 緩沖區(qū)的大小 unsigned char *buffer; 緩沖區(qū)的位置 unsigned char *curp; 當(dāng)前讀寫指針 unsigned i
4、stemp; 臨時文件,指示器 short token; 用于有效性檢驗 FILE;,13.3 文件的打開與關(guān)閉 對文件的讀寫之前應(yīng)“打開”該文件。 使用結(jié)束后“關(guān)閉”此文件。 文件的打開(fopen 函數(shù)) 用fopen函數(shù)實(shí)現(xiàn)對文件的打開。 fopen函數(shù)調(diào)用的一般形式: FILE *fp; fp=fopen(文件名,讀寫方式);,例如: fp=fopen(“a1.txt”, ”r”); 以只讀方式打開文件a1.txt。 fopen函數(shù)返回指向a1.txt文件的指針,即fp是指向a1.txt文件的指針變量,往后就可以通過fp訪問a1.txt文件。,文件讀寫方式: “r” 按只讀方式打開一個
5、文本文件 “w” 按只寫方式打開一個文本文件 “a” 按追加方式打開一個文本文件 “rb” 按只讀方式打開一個二進(jìn)制文件 “wb” 按只寫方式打開一個二進(jìn)制文件 “ab” 按追加方式打開一個二進(jìn)制文件,“r+” 按讀寫方式打開一個文本文件 “w+” 按讀寫方式建立一個新的文本文件 “a+” 按讀寫方式打開一個文本文件 “rb+” 按讀寫方式打開一個二進(jìn)制文件 “wb+” 按讀寫方式建立一個新的二進(jìn)制文 “ab+” 按讀寫方式打開一個二進(jìn)制文件,說明: (1)不能用”r”方式打開一個不存在的文 件,”r”方式只讀不能寫。 (2)“w” 方式只寫不能讀,具有建立和 覆蓋功能。 (3)調(diào)用fopen
6、函數(shù)時,如果返回NULL則 表示打開不成功。,文件的關(guān)閉(fclose 函數(shù)) 在使用完一個文件后應(yīng)用fclose 函數(shù)關(guān) 閉文件,形式為: fclose(文件指針); 如: fclose(fp); 關(guān)閉后fp不再指向該文件。,13.4 文件的讀寫 文件打開后,就可以對它進(jìn)行讀寫了。 文本文件的讀寫 即如何將以文本方式存放的文件輸入到程序的數(shù)據(jù)結(jié)構(gòu)中。如何將程序的數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)以文本方式輸出到文件中。,用于對文本文件讀寫的函數(shù)有: fscanf fprintf fgetc, getc fputc, putc fgets fputs,以例子說明fscanf和fprintf的使用。 例:已知文本
7、文件f1.txt中存放有100個學(xué)生的分?jǐn)?shù),要求讀入這些數(shù)據(jù),并按從高到低的順序排序后輸出到另一文件中。,#include “stdio.h” void sort(int *a,int n) main() int i,a100; FILE *fp; fp=fopen(“f1.txt”, “r”); if(fp=NULL) exit(0);,定義一個指向文件的指針變量,打開文件,使fp指向文件f1.txt,for(i=0;i100;i+) fscanf(fp,”%d”,a+i); fclose(fp); sort(a,100); fp=fopen(“f2.txt”, “w”); for(i=0;
8、i100;i+) fprintf(fp,”%4d”,ai); fclose(fp); ,從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)制方式輸出到文件中。 讀寫函數(shù): fread fwrite getw putw,例:將前例中的排序結(jié)果改用二進(jìn)制方式輸出到文件f3.dat中。 #include “stdio.h” void sort (int *a,int n) main() int i,a100; FILE *fp; fp= f open
9、(“f1.txt”, “r”); if(fp=NULL) exit(0);,for(i=0;i100;i+) fscanf(fp,”%d”,a+i); fclose1(fp); sort(a,100); fp=fopen(“f3.dat”, “wb”); fwrite(a, sizeof(int), 100, fp ); fclose(fp); ,數(shù)據(jù)的開始地址,數(shù)據(jù)的每一項的長度,數(shù)據(jù)的項數(shù),文件的指針,如果要將二進(jìn)制文件f3.dat讀到數(shù)組中,則有:,#include “stdio.h” main() int a100; FILE *fp; fp=fopen(“f3.dat”,“rb”);
10、,if(fp=NULL) exit(0); fread(a,sizeof(int),100,fp); fclose(fp); ,13.5 文件的定位 文件中有一個位置指針,指向當(dāng)前讀寫位置。如果順序讀寫一個文件,每次讀寫完一個字符后,該位置指針自動指向下一個字符位置。如果想改變這樣的規(guī)律,強(qiáng)制使位置指針指向指定位置,可以用有關(guān)函數(shù)。,rewind函數(shù) rewind函數(shù)的作用是使位置指針重返回文件的開頭。 例:對文本文件f1.txt中的100個分?jǐn)?shù)求超過平均分的人數(shù)。,#include “stdio.h” main() int i,a,n=0; float aver=0; FILE *fp; f
11、p=fopen(“f1.txt”,“r”); for(i=0;i100;i+) fscanf(fp,”%d”, ,aver/=100; rewind(fp); for(i=0;iaver) n+; fclose(fp); printf(“n %d”,n); ,fseek函數(shù)和隨機(jī)讀寫 使用fseek函數(shù)可以將位置指針指向所需的位置。 fseek函數(shù)調(diào)用的一般形式: fseek(文件指針,位移量,參考點(diǎn));,以起始點(diǎn)為基準(zhǔn),向前移動的字節(jié)數(shù),0 或 SEEK_SET 文件開始 1 或 SEEK_CUR 當(dāng)前位置 2 或 SEEK_END 文件末尾,例:如果fp是指向一個存放100個整數(shù)的二進(jìn)制文
12、件,要讀取第50個數(shù)到變量n時: fseek(fp,sizeof(int)*(50-1),SEEK_SET); fread(,例:如果fp是指向一個存放100個整數(shù)的文本文件,并已知每個數(shù)按3位數(shù)字的定長格式存放,要讀取第50個數(shù)到變量n時: fseek ( fp, 3*(50-1), SEEK_SE ); fscanf ( fp, ”%3d”, ,例:已知文本文件f5.txt中存放有100個學(xué)生的學(xué)號、姓名和考試成績;要求從鍵盤輸入任一學(xué)號,檢索出相應(yīng)學(xué)生的數(shù)據(jù)。 說明: (1)文件f5.txt中每行為一個學(xué)生的數(shù)據(jù),按定長格式存放,依次為:學(xué)號(整數(shù),占5格)、姓名(占10格)、成績(整數(shù)
13、,占4格)。 (2)按學(xué)號從小到大的順序連號存放,起始學(xué)號為1001。,#include “stdio.h” typedef struct int num; char name20; int score; STU; main() int no; STU st; FILE *fp;,fp=fopen ( “f5.txt” , ”r” ); scanf ( “%d” , ,1001 LiLi 90 1002 WangPing 100 1003 HuHeng 75 ,如果是二進(jìn)制文 件呢?,上例的檢索方法稱為“定位檢索”。 如果是非定長格式,則需要用“遍歷檢索”。 while ( !feof ( f
14、p ) ) fscanf ( fp, ”%d%s%d”, 速度慢,但不受限制,綜合例: 已知文本文件f1.txt中存放有武漢市所有公民的有關(guān)性別和年齡的數(shù)據(jù),請編寫程序分別找出其中10名男壽星和10名女壽星,并將20名壽星的數(shù)據(jù)以文本文件的方式存入到文件f2.txt中(先男后女)。,說明: 文件f1.txt中每行為一個公民的數(shù)據(jù),共有3項,依次為:姓名(不超過10個字符)、性別(0表示男,1表示女)和年齡(整數(shù)),項間以空格分隔。 未給出公民個數(shù),將文件中的數(shù)據(jù)讀完為止。,算法思想: 開辟一個存放20名壽星數(shù)據(jù)的結(jié)果表a(結(jié)構(gòu)體數(shù)組),然后逐個讀取公民數(shù)據(jù),每讀取一個就向a中“判斷插入”一個,
15、男性公民往前段插,女性公民往后段插。,讀一個公民的數(shù)據(jù)到p,讀完否?,N,Y,Wanghao 0 100 Liming 0 98 wudan 1 99 xiaofang 1 95 ,男性插入,女性插入,壽星表a,#include typedef struct char name10; int sex; int age; PEP;,插入函數(shù),將一個公民的數(shù)據(jù)插入到壽星表void insert (PEP *a, int n, PEP t ) int i,j; if ( t.age ai.age) break; for ( j=n-1; ji; j-) aj=aj-1; 移位 ai=t; 插入,main() int j; PEP p,a20; FIL
溫馨提示
- 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ù)學(xué)試卷
- 福州十九中一模數(shù)學(xué)試卷
- 肉牛生產(chǎn)技術(shù)課件
- 2025年廣東東莞市第六人民醫(yī)院招聘納入崗位管理編制外人員3人筆試歷年專業(yè)考點(diǎn)(難、易錯點(diǎn))附帶答案詳解
- 2025年云南臨滄市臨翔區(qū)醫(yī)共體鄉(xiāng)村醫(yī)生招聘(5人)筆試歷年專業(yè)考點(diǎn)(難、易錯點(diǎn))附帶答案詳解
- 2025年02月四川省臨床醫(yī)學(xué)研究中心(兒童腎?。B毧蒲腥藛T招聘1人筆試歷年專業(yè)考點(diǎn)(難、易錯點(diǎn))附帶答案詳解
- 中心靜脈狹窄介入治療課件
- 2025至2030財務(wù)管理系統(tǒng)行業(yè)市場深度研究與戰(zhàn)略咨詢分析報告
- 高中性價比高的數(shù)學(xué)試卷
- 碳排放權(quán)交易市場與能源效率提升的關(guān)聯(lián)性研究考核試卷
- 幼兒園中班彩虹泡泡龍課件
- 非遺資源數(shù)據(jù)庫建設(shè)
- 報案材料范本
- 林地贈與協(xié)議書(2篇)
- 2023四年級數(shù)學(xué)上冊 1 大數(shù)的認(rèn)識第11課時 用計算器計算教案 新人教版
- 2023年石嘴山市直機(jī)關(guān)遴選公務(wù)員考試真題
- GCP相關(guān)人員職責(zé)
- CTD申報資料:創(chuàng)新藥IND模塊一-行政文件和藥品信息
- (高清版)JTGT 3331-2024 采空區(qū)公路設(shè)計與施工技術(shù)規(guī)范
- 2024廣西公需課高質(zhì)量共建“一帶一路”譜寫人類命運(yùn)共同體新篇章答案
- 人的不安全行為管理
評論
0/150
提交評論