版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第十章第十章 文件文件10.1 10.1 文件概述文件概述 文件概念文件概念 所謂文件就是:存儲(chǔ)在外部介質(zhì)上所謂文件就是:存儲(chǔ)在外部介質(zhì)上 的信息集合。的信息集合。 根據(jù)存儲(chǔ)的介質(zhì)不同可分為:根據(jù)存儲(chǔ)的介質(zhì)不同可分為: 磁盤文件磁盤文件、磁帶文件磁帶文件等。等。 根據(jù)內(nèi)容的不同可分為:根據(jù)內(nèi)容的不同可分為: 程序文件程序文件、數(shù)據(jù)數(shù)據(jù)文件文件等。等。 使用文件輸入輸出的必要性使用文件輸入輸出的必要性 這里主要討論數(shù)據(jù)文件的輸入輸出,即這里主要討論數(shù)據(jù)文件的輸入輸出,即如何將文件中的數(shù)據(jù)如何將文件中的數(shù)據(jù)“輸入輸入”到程序的數(shù)據(jù)到程序的數(shù)據(jù)結(jié)構(gòu)中,如何將程序的數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)結(jié)構(gòu)中,如何將程序的
2、數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)“輸出輸出”到文件中。到文件中。 以往的輸入輸出方法:以往的輸入輸出方法: 鍵盤輸入鍵盤輸入 ,屏幕輸出。,屏幕輸出。 這種方法不適用于數(shù)據(jù)量大的情況。這種方法不適用于數(shù)據(jù)量大的情況。 舉例說明:舉例說明:main() int i, a1000; for(i=0;i1000;i+) scanf(“%d”,a+i); for(i=0;i1000;i+) printf(“%5d”,ai); 缺缺 點(diǎn):點(diǎn):手工輸入,手工輸入,效率低下,容效率低下,容易出錯(cuò)易出錯(cuò)。輸出的數(shù)據(jù)輸出的數(shù)據(jù)不能保存,不不能保存,不便于進(jìn)一步使便于進(jìn)一步使 用。用。采用文件輸入輸出可以克服這些缺點(diǎn)。采用文件輸
3、入輸出可以克服這些缺點(diǎn)。main() int i, a1000; for(i=0;i1000;i+) scanf(“%d”,a+i); for(i=0;i1000;i+) printf(“%5d”,ai);文件文件 C C文件分類文件分類 按在磁盤上存儲(chǔ)的形式不同,可分為:按在磁盤上存儲(chǔ)的形式不同,可分為: 文本文件:文本文件: 以以ASCIIASCII字符存放字符存放可見、可編輯、占可見、可編輯、占空間大,讀寫效率低??臻g大,讀寫效率低。 二進(jìn)制文件:二進(jìn)制文件:以二進(jìn)制形式存放以二進(jìn)制形式存放可讀性差可讀性差、占空間小,、占空間小,讀寫效率高。讀寫效率高。 使用時(shí)可根據(jù)需要選擇。使用時(shí)可根
4、據(jù)需要選擇。10.2 10.2 文件類型指針文件類型指針 每個(gè)被使用的文件都在內(nèi)存中開辟一每個(gè)被使用的文件都在內(nèi)存中開辟一個(gè)區(qū),用來存放文件的有關(guān)信息(如文件個(gè)區(qū),用來存放文件的有關(guān)信息(如文件名、文件狀態(tài)及文件當(dāng)前位置等)。這些名、文件狀態(tài)及文件當(dāng)前位置等)。這些信息保存在一個(gè)信息保存在一個(gè)FILEFILE類型的結(jié)構(gòu)體變量中類型的結(jié)構(gòu)體變量中。 若若 FILE FILE * *fp;fp; 則則fpfp就稱為指向文件就稱為指向文件類型的指針變量。訪問文件通過文件指針類型的指針變量。訪問文件通過文件指針進(jìn)行。進(jìn)行。 FILEFILE結(jié)構(gòu)體類型是由系統(tǒng)定義的。結(jié)構(gòu)體類型是由系統(tǒng)定義的。具體定義如
5、下:具體定義如下: typedef struct short level; 緩沖區(qū)緩沖區(qū)“滿滿”或或“空空”的程度的程度 unsigned flags; 文件狀態(tài)標(biāo)志文件狀態(tài)標(biāo)志 char fd; 文件描述符文件描述符 unsigned char hold; 如無緩沖區(qū)不讀取字符如無緩沖區(qū)不讀取字符 short bsize; 緩沖區(qū)的大小緩沖區(qū)的大小 unsigned char *buffer; 緩沖區(qū)的位置緩沖區(qū)的位置 unsigned char *curp; 當(dāng)前讀寫指針當(dāng)前讀寫指針 unsigned istemp; 臨時(shí)文件,指示器臨時(shí)文件,指示器 short token; 用于有效性檢
6、驗(yàn)用于有效性檢驗(yàn) FILE;10.3 10.3 文件的打開與關(guān)閉文件的打開與關(guān)閉 對文件的讀寫之前應(yīng)對文件的讀寫之前應(yīng)“打開打開”該文件。該文件。 使用結(jié)束后使用結(jié)束后“關(guān)閉關(guān)閉”此文件。此文件。 文件的打開文件的打開(fopen fopen 函數(shù))函數(shù)) 用用fopenfopen函數(shù)實(shí)現(xiàn)對文件的打開。函數(shù)實(shí)現(xiàn)對文件的打開。 fopenfopen函數(shù)調(diào)用的一般形式:函數(shù)調(diào)用的一般形式: FILE FILE * *fp;fp; fp=fopen( fp=fopen(文件名,讀寫方式文件名,讀寫方式) ); 例如:例如: fp=fopen(fp=fopen(“a1.txta1.txt”, , ”r
7、 r”);); 以只讀方式打開文件以只讀方式打開文件a1.txta1.txt。fopenfopen函數(shù)返回指向函數(shù)返回指向a1.txta1.txt文件的指文件的指針,即針,即fpfp是指向是指向a1.txta1.txt文件的指針變文件的指針變量,往后就可以通過量,往后就可以通過fpfp訪問訪問a1.txta1.txt文文件。件。文件讀寫方式:文件讀寫方式: “r” 按按只讀只讀方式打開一個(gè)方式打開一個(gè)文本文本文件文件 “w” 按按只寫只寫方式打開一個(gè)方式打開一個(gè)文本文本文件文件 “a” 按按追加追加方式打開一個(gè)方式打開一個(gè)文本文本文件文件 “rb” 按按只讀只讀方式打開一個(gè)方式打開一個(gè)二進(jìn)制二
8、進(jìn)制文件文件 “wb” 按按只寫只寫方式打開一個(gè)方式打開一個(gè)二進(jìn)制二進(jìn)制文件文件 “ab” 按按追加追加方式打開一個(gè)方式打開一個(gè)二進(jìn)制二進(jìn)制文件文件 說明:說明: (1 1)不能用)不能用”r r”方式打開一個(gè)不存在的文方式打開一個(gè)不存在的文 件,件,”r r”方式只讀不能寫。方式只讀不能寫。 (2 2)“w w” 方式只寫不能讀,具有建立和方式只寫不能讀,具有建立和 覆蓋功能。覆蓋功能。 (3 3)調(diào)用)調(diào)用fopenfopen函數(shù)時(shí),如果返回函數(shù)時(shí),如果返回NULLNULL則則 表示打開不成功。表示打開不成功。文件的關(guān)閉文件的關(guān)閉(fclose fclose 函數(shù))函數(shù))在使用完一個(gè)文件后
9、應(yīng)用在使用完一個(gè)文件后應(yīng)用fclose fclose 函數(shù)關(guān)函數(shù)關(guān) 閉文件,形式為:閉文件,形式為:fclosefclose(文件指針文件指針););如:如: fclose(fp);fclose(fp); 關(guān)閉后關(guān)閉后fpfp不再指向該文件。不再指向該文件。10.4 10.4 文件的讀寫文件的讀寫 文件打開后,就可以對它進(jìn)行讀寫了。文件打開后,就可以對它進(jìn)行讀寫了。 文本文件的讀寫文本文件的讀寫 即如何將以文本方式存放的文件輸入到程即如何將以文本方式存放的文件輸入到程序的數(shù)據(jù)結(jié)構(gòu)中。如何將程序的數(shù)據(jù)結(jié)構(gòu)中序的數(shù)據(jù)結(jié)構(gòu)中。如何將程序的數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)以文本方式輸出到文件中。的數(shù)據(jù)以文本方式輸出到
10、文件中。 讀對象:讀對象:以文本方式存放的文件以文本方式存放的文件 寫對象:寫對象:以文本方式存放的文件以文本方式存放的文件 用于對文本文件讀寫的函數(shù)有用于對文本文件讀寫的函數(shù)有: fscanf fprintf fgetc, getc fputc, putc fgets fputs 重點(diǎn)介紹重點(diǎn)介紹 fscanf fscanf 和和 fprintffprintf。以例子說明以例子說明fscanffscanf和和fprintffprintf的使用。的使用。 例:已知文本文件例:已知文本文件f1.txtf1.txt中存放有中存放有100100個(gè)學(xué)生的分?jǐn)?shù),要求讀入這些數(shù)據(jù),個(gè)學(xué)生的分?jǐn)?shù),要求讀入這
11、些數(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);定義一個(gè)指向文件的指針變量打開文件,打開文件,使使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所指所指的文件中的文件中讀數(shù)據(jù)讀數(shù)據(jù)關(guān)閉關(guān)閉fp所所指的文件指的文件注意:文本文件的輸入格式要與注意:文本文件的輸入格式要與 文件中的數(shù)據(jù)格式匹配。文件中的數(shù)據(jù)格式匹配。 二進(jìn)制文件的讀寫二進(jìn)制文件的讀寫 (數(shù)據(jù)塊)(數(shù)據(jù)塊) 即如何將以二進(jìn)制方式存放的文件輸入即如何將以二進(jìn)制方式存放的文件輸入到程序的數(shù)據(jù)結(jié)構(gòu)中。到程序的數(shù)據(jù)結(jié)構(gòu)中。 如何將數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)以二進(jìn)制方式如何將數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)以二進(jìn)制方式輸出到文件中。輸出到文件中。讀對象:讀對象:以二進(jìn)制方式存放的文件以二進(jìn)制方式存放的文件寫對象:寫對象:以二進(jìn)制
13、方式存放的文件以二進(jìn)制方式存放的文件 讀寫函數(shù):讀寫函數(shù): fread fwrite getw putw例:將前例中的排序結(jié)果改用二進(jìn)制方式例:將前例中的排序結(jié)果改用二進(jìn)制方式輸出到文件輸出到文件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);數(shù)據(jù)的開始地址數(shù)據(jù)的每一項(xiàng)的長度數(shù) 據(jù) 的項(xiàng)數(shù)文件的指針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”數(shù)據(jù)讀入內(nèi)存并輸出到屏幕數(shù)據(jù)讀入內(nèi)存并輸出到屏幕10.5 10.5 文件的定位文件的定位 文件中有一個(gè)位置指針,指向當(dāng)前讀寫文件中有一個(gè)位置指針,指向當(dāng)前讀寫位置。如果順序讀寫一個(gè)文件,每次讀寫完位置。如果順序讀寫一個(gè)文件,每次讀寫完一個(gè)字符后,該位置指針自動(dòng)指向下一個(gè)字一個(gè)字符后,該位置指針自動(dòng)指向下一個(gè)字符位置。如果想改變這樣的規(guī)律,強(qiáng)制使位符位置。如果想改變這樣的規(guī)律,強(qiáng)制使位置指針指向指定位置,可以用有關(guān)函數(shù)。
16、置指針指向指定位置,可以用有關(guān)函數(shù)。 rewindrewind函數(shù)函數(shù) rewindrewind函數(shù)的作用是使位置指針重返函數(shù)的作用是使位置指針重返回文件的開頭?;匚募拈_頭。 例:例:對文本文件對文本文件f1.txtf1.txt中的中的100100個(gè)分?jǐn)?shù)個(gè)分?jǐn)?shù)求超過平均分的人數(shù)。求超過平均分的人數(shù)。#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函數(shù)和隨機(jī)讀寫函數(shù)和隨機(jī)讀寫 使用使用fseekfseek函數(shù)可以將位置指針指向所需函數(shù)可以將位置指針指向所需的位置。的位置。 fseekfseek函數(shù)調(diào)用的一般形式:函數(shù)調(diào)用的一般形式: fseekfseek(文件指針,位移量,參考點(diǎn))(文件指針,位移量,參考點(diǎn)); ;以起始點(diǎn)為基以起始點(diǎn)為基準(zhǔn),向前移動(dòng)準(zhǔn),向前移動(dòng)的字節(jié)數(shù)的字節(jié)數(shù)0 0 或或 SEEK_SET SEEK_SET 文件開始文件開始1 1 或或 SEEK_CUR SEEK_CUR 當(dāng)前位置當(dāng)前位置2 2
18、 或或 SEEK_END SEEK_END 文件末尾文件末尾例:例:如果如果fpfp是指向一個(gè)存放是指向一個(gè)存放100100個(gè)整數(shù)的二進(jìn)個(gè)整數(shù)的二進(jìn)制文件,要讀取第制文件,要讀取第5050個(gè)數(shù)到變量個(gè)數(shù)到變量n n時(shí):時(shí): fseek(fp,sizeof(int)*(50-1),SEEK_SET); fread(&n, sizeof(int), 1,fp);例:例:如果如果fpfp是指向一個(gè)存放是指向一個(gè)存放100100個(gè)整數(shù)的文個(gè)整數(shù)的文本文件,并已知每個(gè)數(shù)按本文件,并已知每個(gè)數(shù)按3 3位數(shù)字的定長格式位數(shù)字的定長格式存放,要讀取第存放,要讀取第5050個(gè)數(shù)到變量個(gè)數(shù)到變量n n時(shí):
19、時(shí): fseek ( fp, 3*(50-1), SEEK_SET ); fscanf ( fp, ”%3d”, &n);若要從當(dāng)前位置跳過若要從當(dāng)前位置跳過1010個(gè)數(shù)后讀取一個(gè)數(shù):個(gè)數(shù)后讀取一個(gè)數(shù): fseek ( fp, 3*10, SEEK_CUR ); fscanf ( fp, ”%3d”, &n); 例:已知文本文件例:已知文本文件f5.datf5.dat中存放有中存放有100100個(gè)學(xué)個(gè)學(xué)生的學(xué)號、姓名和考試成績;要求從鍵盤輸入生的學(xué)號、姓名和考試成績;要求從鍵盤輸入任一學(xué)號,檢索出相應(yīng)學(xué)生的數(shù)據(jù)。任一學(xué)號,檢索出相應(yīng)學(xué)生的數(shù)據(jù)。說明:說明:(1 1)文件)文件f
20、5.datf5.dat中每行為一個(gè)學(xué)生的數(shù)據(jù),按定中每行為一個(gè)學(xué)生的數(shù)據(jù),按定長格式存放,依次為:學(xué)號(整數(shù),占長格式存放,依次為:學(xué)號(整數(shù),占5 5格)、姓名格)、姓名(占(占1010格)、成績(整數(shù),占格)、成績(整數(shù),占4 4格)。格)。(2 2)按學(xué)號從小到大的順序連號存放,起始學(xué)號)按學(xué)號從小到大的順序連號存放,起始學(xué)號為為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中存放有武漢市所有中存放有武漢市所有公民的有關(guān)性別和年齡的數(shù)據(jù),請編寫程序分公民的有關(guān)性別和年齡的數(shù)據(jù),請編寫程序分別找出其中別找出其中1010名男壽星和
23、名男壽星和1010名女壽星,并將名女壽星,并將2020名壽星的數(shù)據(jù)以文本文件的方式存入到文件名壽星的數(shù)據(jù)以文本文件的方式存入到文件f2.datf2.dat中(先男后女)。中(先男后女)。 說明:說明: 文件文件f1.datf1.dat中每行為一個(gè)公民的數(shù)據(jù),共有中每行為一個(gè)公民的數(shù)據(jù),共有3 3項(xiàng)項(xiàng),依次為:姓名(不超過,依次為:姓名(不超過1010個(gè)字符)、性別(個(gè)字符)、性別(0 0表示表示男,男,1 1表示女)和年齡(整數(shù)),項(xiàng)間以空格分隔。表示女)和年齡(整數(shù)),項(xiàng)間以空格分隔。 未給出公民個(gè)數(shù),將文件中的數(shù)據(jù)讀完為止。未給出公民個(gè)數(shù),將文件中的數(shù)據(jù)讀完為止。算法思想:算法思想:開辟一個(gè)存放開辟一個(gè)存放2020名壽星數(shù)據(jù)的結(jié)果表名壽星數(shù)據(jù)的結(jié)果表a a(結(jié)構(gòu)體數(shù)組),然后逐個(gè)讀取公民(結(jié)構(gòu)體數(shù)組),然后逐個(gè)讀取公民數(shù)據(jù),每讀取一個(gè)就向數(shù)據(jù),每讀取一個(gè)就向a a中中
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《森林資源產(chǎn)權(quán)市場建設(shè)研究》
- 水煮花生課程設(shè)計(jì)理念
- 《橋梁預(yù)防性養(yǎng)護(hù)的異構(gòu)數(shù)據(jù)的整合與清洗研究》
- 《含氮雜環(huán)吲哚對同步厭氧氨氧化反硝化系統(tǒng)脫氮性能影響及降解機(jī)制》
- 《基于不同電刷材料特性對連續(xù)變焦電機(jī)控制系統(tǒng)影響研究》
- 《三相PWM整流器帶變換器負(fù)載時(shí)的穩(wěn)定性研究》
- 2025年度企業(yè)墊資服務(wù)合作協(xié)議書樣本2篇
- 2025年度環(huán)保節(jié)能項(xiàng)目安全生產(chǎn)及環(huán)境保護(hù)合作協(xié)議2篇
- 脫式計(jì)算教學(xué)課程設(shè)計(jì)
- 熱帶植物課程設(shè)計(jì)
- 埃美柯閥門檢驗(yàn)報(bào)告匯總-391黃銅調(diào)節(jié)閥
- 景德鎮(zhèn)陶瓷大學(xué)高等數(shù)學(xué)期末考試試卷(含答案)
- 精裝修房分戶驗(yàn)收記錄表
- 五輸穴與臨床應(yīng)用課件
- 工程項(xiàng)目施工方案比選
- 盾構(gòu)始發(fā)施工技術(shù)要點(diǎn)PPT(44頁)
- 甲烷(沼氣)的理化性質(zhì)及危險(xiǎn)特性表
- 某鋼鐵有限責(zé)任公司管理專案報(bào)告書---提升配電系統(tǒng)管理水平降低變配電裝置事故率
- 促銷費(fèi)用管理辦法15
- GB 13296-2013 鍋爐、熱交換器用不銹鋼無縫鋼管(高清版)
- 中醫(yī)院中藥的飲片處方用名與調(diào)劑給付規(guī)定
評論
0/150
提交評論