




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第十章第十章 文件文件10.1 10.1 文件概述文件概述 文件概念文件概念 所謂文件就是:存儲在外部介質上所謂文件就是:存儲在外部介質上 的信息集合。的信息集合。 根據存儲的介質不同可分為:根據存儲的介質不同可分為: 磁盤文件磁盤文件、磁帶文件磁帶文件等。等。 根據內容的不同可分為:根據內容的不同可分為: 程序文件程序文件、數據數據文件文件等。等。 使用文件輸入輸出的必要性使用文件輸入輸出的必要性 這里主要討論數據文件的輸入輸出,即這里主要討論數據文件的輸入輸出,即如何將文件中的數據如何將文件中的數據“輸入輸入”到程序的數據到程序的數據結構中,如何將程序的數據結構中的數據結構中,如何將程序的
2、數據結構中的數據“輸出輸出”到文件中。到文件中。 以往的輸入輸出方法:以往的輸入輸出方法: 鍵盤輸入鍵盤輸入 ,屏幕輸出。,屏幕輸出。 這種方法不適用于數據量大的情況。這種方法不適用于數據量大的情況。 舉例說明:舉例說明:main() int i, a1000; for(i=0;i1000;i+) scanf(“%d”,a+i); for(i=0;i1000;i+) printf(“%5d”,ai); 缺缺 點:點:手工輸入,手工輸入,效率低下,容效率低下,容易出錯易出錯。輸出的數據輸出的數據不能保存,不不能保存,不便于進一步使便于進一步使 用。用。采用文件輸入輸出可以克服這些缺點。采用文件輸
3、入輸出可以克服這些缺點。main() int i, a1000; for(i=0;i1000;i+) scanf(“%d”,a+i); for(i=0;i1000;i+) printf(“%5d”,ai);文件文件 C C文件分類文件分類 按在磁盤上存儲的形式不同,可分為:按在磁盤上存儲的形式不同,可分為: 文本文件:文本文件: 以以ASCIIASCII字符存放字符存放可見、可編輯、占可見、可編輯、占空間大,讀寫效率低??臻g大,讀寫效率低。 二進制文件:二進制文件:以二進制形式存放以二進制形式存放可讀性差可讀性差、占空間小,、占空間小,讀寫效率高。讀寫效率高。 使用時可根據需要選擇。使用時可根
4、據需要選擇。10.2 10.2 文件類型指針文件類型指針 每個被使用的文件都在內存中開辟一每個被使用的文件都在內存中開辟一個區(qū),用來存放文件的有關信息(如文件個區(qū),用來存放文件的有關信息(如文件名、文件狀態(tài)及文件當前位置等)。這些名、文件狀態(tài)及文件當前位置等)。這些信息保存在一個信息保存在一個FILEFILE類型的結構體變量中類型的結構體變量中。 若若 FILE FILE * *fp;fp; 則則fpfp就稱為指向文件就稱為指向文件類型的指針變量。訪問文件通過文件指針類型的指針變量。訪問文件通過文件指針進行。進行。 FILEFILE結構體類型是由系統(tǒng)定義的。結構體類型是由系統(tǒng)定義的。具體定義如
5、下:具體定義如下: typedef struct short level; 緩沖區(qū)緩沖區(qū)“滿滿”或或“空空”的程度的程度 unsigned flags; 文件狀態(tài)標志文件狀態(tài)標志 char fd; 文件描述符文件描述符 unsigned char hold; 如無緩沖區(qū)不讀取字符如無緩沖區(qū)不讀取字符 short bsize; 緩沖區(qū)的大小緩沖區(qū)的大小 unsigned char *buffer; 緩沖區(qū)的位置緩沖區(qū)的位置 unsigned char *curp; 當前讀寫指針當前讀寫指針 unsigned istemp; 臨時文件,指示器臨時文件,指示器 short token; 用于有效性檢
6、驗用于有效性檢驗 FILE;10.3 10.3 文件的打開與關閉文件的打開與關閉 對文件的讀寫之前應對文件的讀寫之前應“打開打開”該文件。該文件。 使用結束后使用結束后“關閉關閉”此文件。此文件。 文件的打開文件的打開(fopen fopen 函數)函數) 用用fopenfopen函數實現對文件的打開。函數實現對文件的打開。 fopenfopen函數調用的一般形式:函數調用的一般形式: FILE FILE * *fp;fp; fp=fopen( fp=fopen(文件名,讀寫方式文件名,讀寫方式) ); 例如:例如: fp=fopen(fp=fopen(“a1.txta1.txt”, , ”r
7、 r”);); 以只讀方式打開文件以只讀方式打開文件a1.txta1.txt。fopenfopen函數返回指向函數返回指向a1.txta1.txt文件的指文件的指針,即針,即fpfp是指向是指向a1.txta1.txt文件的指針變文件的指針變量,往后就可以通過量,往后就可以通過fpfp訪問訪問a1.txta1.txt文文件。件。文件讀寫方式:文件讀寫方式: “r” 按按只讀只讀方式打開一個方式打開一個文本文本文件文件 “w” 按按只寫只寫方式打開一個方式打開一個文本文本文件文件 “a” 按按追加追加方式打開一個方式打開一個文本文本文件文件 “rb” 按按只讀只讀方式打開一個方式打開一個二進制二
8、進制文件文件 “wb” 按按只寫只寫方式打開一個方式打開一個二進制二進制文件文件 “ab” 按按追加追加方式打開一個方式打開一個二進制二進制文件文件 說明:說明: (1 1)不能用)不能用”r r”方式打開一個不存在的文方式打開一個不存在的文 件,件,”r r”方式只讀不能寫。方式只讀不能寫。 (2 2)“w w” 方式只寫不能讀,具有建立和方式只寫不能讀,具有建立和 覆蓋功能。覆蓋功能。 (3 3)調用)調用fopenfopen函數時,如果返回函數時,如果返回NULLNULL則則 表示打開不成功。表示打開不成功。文件的關閉文件的關閉(fclose fclose 函數)函數)在使用完一個文件后
9、應用在使用完一個文件后應用fclose fclose 函數關函數關 閉文件,形式為:閉文件,形式為:fclosefclose(文件指針文件指針););如:如: fclose(fp);fclose(fp); 關閉后關閉后fpfp不再指向該文件。不再指向該文件。10.4 10.4 文件的讀寫文件的讀寫 文件打開后,就可以對它進行讀寫了。文件打開后,就可以對它進行讀寫了。 文本文件的讀寫文本文件的讀寫 即如何將以文本方式存放的文件輸入到程即如何將以文本方式存放的文件輸入到程序的數據結構中。如何將程序的數據結構中序的數據結構中。如何將程序的數據結構中的數據以文本方式輸出到文件中。的數據以文本方式輸出到
10、文件中。 讀對象:讀對象:以文本方式存放的文件以文本方式存放的文件 寫對象:寫對象:以文本方式存放的文件以文本方式存放的文件 用于對文本文件讀寫的函數有用于對文本文件讀寫的函數有: fscanf fprintf fgetc, getc fputc, putc fgets fputs 重點介紹重點介紹 fscanf fscanf 和和 fprintffprintf。以例子說明以例子說明fscanffscanf和和fprintffprintf的使用。的使用。 例:已知文本文件例:已知文本文件f1.txtf1.txt中存放有中存放有100100個學生的分數,要求讀入這些數據,個學生的分數,要求讀入這
11、些數據,并按從高到低的順序排序后輸出到另一并按從高到低的順序排序后輸出到另一文件中。文件中。#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.txtfor(i=0;i100;i+) fscanf(fp,”%d”,a+i); fclose(fp); sort(a,100);fp=fopen(“f2.txt”, “w”);for(i=0;i100
12、;i+) fprintf(fp,”%4d”,ai);fclose(fp);從從fp所指所指的文件中的文件中讀數據讀數據關閉關閉fp所所指的文件指的文件注意:文本文件的輸入格式要與注意:文本文件的輸入格式要與 文件中的數據格式匹配。文件中的數據格式匹配。 二進制文件的讀寫二進制文件的讀寫 (數據塊)(數據塊) 即如何將以二進制方式存放的文件輸入即如何將以二進制方式存放的文件輸入到程序的數據結構中。到程序的數據結構中。 如何將數據結構中的數據以二進制方式如何將數據結構中的數據以二進制方式輸出到文件中。輸出到文件中。讀對象:讀對象:以二進制方式存放的文件以二進制方式存放的文件寫對象:寫對象:以二進制
13、方式存放的文件以二進制方式存放的文件 讀寫函數:讀寫函數: fread fwrite getw putw例:將前例中的排序結果改用二進制方式例:將前例中的排序結果改用二進制方式輸出到文件輸出到文件f3.datf3.dat中。中。#include “stdio.h”struct student int num; char name20; int score;void sort (int *a,int n) main() int i; struct student a100; FILE *fp; fp= f open(“f1.txt”, “r”); if(fp=NULL) exit(0);for(
14、i=0;i100;i+) fscanf(fp,”%d %s %d”,&ai.num,&,ai.score);fclose1(fp);sort(a,100);fp=fopen(“f3.dat”, “wb”);for(i=0;i100;i+) fwrite(a+i, sizeof(struct student), 1, fp );fclose(fp);數據的開始地址數據的每一項的長度數 據 的項數文件的指針fp=fopen(“f3.dat”, “rb”);for(i=0;i100;i+) fread(a+i,sizeof(struct student),1,fp);p
15、rintf(“num:%-5d name:%-10s score:% 3d”, ai.num, , ai.score);fclose(fp);/將將“f3.dat”數據讀入內存并輸出到屏幕數據讀入內存并輸出到屏幕10.5 10.5 文件的定位文件的定位 文件中有一個位置指針,指向當前讀寫文件中有一個位置指針,指向當前讀寫位置。如果順序讀寫一個文件,每次讀寫完位置。如果順序讀寫一個文件,每次讀寫完一個字符后,該位置指針自動指向下一個字一個字符后,該位置指針自動指向下一個字符位置。如果想改變這樣的規(guī)律,強制使位符位置。如果想改變這樣的規(guī)律,強制使位置指針指向指定位置,可以用有關函數。
16、置指針指向指定位置,可以用有關函數。 rewindrewind函數函數 rewindrewind函數的作用是使位置指針重返函數的作用是使位置指針重返回文件的開頭?;匚募拈_頭。 例:例:對文本文件對文本文件f1.txtf1.txt中的中的100100個分數個分數求超過平均分的人數。求超過平均分的人數。#include “stdio.h”main() int i,a,n=0; float aver=0;FILE *fp;fp=fopen(“f1.txt”,“r”);for(i=0;i100;i+) fscanf(fp,”%d”,&a); aver+=a;aver/=100;rewind(
17、fp);for(i=0;iaver) n+; fclose(fp); printf(“n %d”,n); fseekfseek函數和隨機讀寫函數和隨機讀寫 使用使用fseekfseek函數可以將位置指針指向所需函數可以將位置指針指向所需的位置。的位置。 fseekfseek函數調用的一般形式:函數調用的一般形式: fseekfseek(文件指針,位移量,參考點)(文件指針,位移量,參考點); ;以起始點為基以起始點為基準,向前移動準,向前移動的字節(jié)數的字節(jié)數0 0 或或 SEEK_SET SEEK_SET 文件開始文件開始1 1 或或 SEEK_CUR SEEK_CUR 當前位置當前位置2 2
18、 或或 SEEK_END SEEK_END 文件末尾文件末尾例:例:如果如果fpfp是指向一個存放是指向一個存放100100個整數的二進個整數的二進制文件,要讀取第制文件,要讀取第5050個數到變量個數到變量n n時:時: fseek(fp,sizeof(int)*(50-1),SEEK_SET); fread(&n, sizeof(int), 1,fp);例:例:如果如果fpfp是指向一個存放是指向一個存放100100個整數的文個整數的文本文件,并已知每個數按本文件,并已知每個數按3 3位數字的定長格式位數字的定長格式存放,要讀取第存放,要讀取第5050個數到變量個數到變量n n時:
19、時: fseek ( fp, 3*(50-1), SEEK_SET ); fscanf ( fp, ”%3d”, &n);若要從當前位置跳過若要從當前位置跳過1010個數后讀取一個數:個數后讀取一個數: fseek ( fp, 3*10, SEEK_CUR ); fscanf ( fp, ”%3d”, &n); 例:已知文本文件例:已知文本文件f5.datf5.dat中存放有中存放有100100個學個學生的學號、姓名和考試成績;要求從鍵盤輸入生的學號、姓名和考試成績;要求從鍵盤輸入任一學號,檢索出相應學生的數據。任一學號,檢索出相應學生的數據。說明:說明:(1 1)文件)文件f
20、5.datf5.dat中每行為一個學生的數據,按定中每行為一個學生的數據,按定長格式存放,依次為:學號(整數,占長格式存放,依次為:學號(整數,占5 5格)、姓名格)、姓名(占(占1010格)、成績(整數,占格)、成績(整數,占4 4格)。格)。(2 2)按學號從小到大的順序連號存放,起始學號)按學號從小到大的順序連號存放,起始學號為為10011001。#include “stdio.h”typedef struct int num; char name20; int score; STU;main() int no; STU st; FILE *fp;fp=fopen ( “f5.dat”
21、, ”r” );scanf ( “%d” , &no );fseek ( fp, (no-1001)*19, 0 );fscanf ( fp, ”%5d%10s%4d” ,&st.num ,, &st.score );printf (“n%5d%10s%4d” , st.num , , st.score ) ;fclose ( fp ) ; 1001 LiLi 901002 WangPing 1001003 HuHeng 75 上例的檢索方法稱為上例的檢索方法稱為“定位檢索定位檢索”。如果是非定長格式,則需要用如果是非定長格式,則需要用“遍歷
22、檢索遍歷檢索”。 while ( !feof ( fp ) ) fscanf ( fp, ”%d%s%d”, &st.num, , &st.score ); if ( st.num=no ) printf ( “n%5d%10s%4d”, st.num, , st.score ); break; 速度慢,但不受限制速度慢,但不受限制 綜合例:綜合例: 已知文本文件已知文本文件f1.datf1.dat中存放有武漢市所有中存放有武漢市所有公民的有關性別和年齡的數據,請編寫程序分公民的有關性別和年齡的數據,請編寫程序分別找出其中別找出其中1010名男壽星和
23、名男壽星和1010名女壽星,并將名女壽星,并將2020名壽星的數據以文本文件的方式存入到文件名壽星的數據以文本文件的方式存入到文件f2.datf2.dat中(先男后女)。中(先男后女)。 說明:說明: 文件文件f1.datf1.dat中每行為一個公民的數據,共有中每行為一個公民的數據,共有3 3項項,依次為:姓名(不超過,依次為:姓名(不超過1010個字符)、性別(個字符)、性別(0 0表示表示男,男,1 1表示女)和年齡(整數),項間以空格分隔。表示女)和年齡(整數),項間以空格分隔。 未給出公民個數,將文件中的數據讀完為止。未給出公民個數,將文件中的數據讀完為止。算法思想:算法思想:開辟一個存放開辟一個存放2020名壽星數據的結果表名壽星數據的結果表a a(結構體數組),然后逐個讀取公民(結構體數組),然后逐個讀取公民數據,每讀取一個就向數據,每讀取一個就向a a中中
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024遼寧一模語文作文
- 全國人教版信息技術八年級上冊第三單元第13課一、《場景操作》教學設計
- 南路小區(qū)施工方案
- 新進護理人員崗前培訓
- 2025實驗室家具采購合同
- 木工現場施工方案
- 海上沉井施工方案
- 2024年秋九年級化學下冊 第七章 溶液 7.3 溶液濃稀的表示 7.3.1 溶質的質量分數及其簡單計算教學設計 (新版)粵教版
- 年產15萬套汽車車身控制模塊項目可行性研究報告模板-立項備案
- 河底 改良 施工方案
- 2022年江蘇省南京市中考歷史試題(含答案)
- 電雀精品 低壓抽屜柜通用銅排自動計算方法
- 最新版?zhèn)€人征信報告(可編輯+帶水印)
- 《冷沖壓工藝與模具設計》完整版ppt課件全套教程
- 健身教練職業(yè)能力測評考試專項理論題庫與答案
- 波浪理論技巧
- 食品毒理學云南農業(yè)科學技術學院
- 濰坊第二熱電廠鋼結構工程施工組織設計
- 《建筑裝飾構造》全套教案(完整版)
- 魯班尺和丁蘭尺速查表
- WES溢流堰面曲線計算
評論
0/150
提交評論