c語言程序設計課件:第十三章文件_第1頁
c語言程序設計課件:第十三章文件_第2頁
c語言程序設計課件:第十三章文件_第3頁
c語言程序設計課件:第十三章文件_第4頁
c語言程序設計課件:第十三章文件_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

第十三章文件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()

{inti,a[1000];

for(i=0;i<1000;i++)

scanf(“%d”,a+i);

for(i=0;i<1000;i++)

printf(“%5d”,a[i]);

}缺點:①可能出現(xiàn)重復輸入。②輸出的數(shù)據(jù)不能保存,不能進一步使用。采用文件輸入輸出可以克服這些缺點。main(){

inti,a[1000];

for(i=0;i<1000;i++)

scanf(“%d”,a+i);

┊for(i=0;i<1000;i++)

printf(“%5d”,a[i]);}}文件文件■

C文件分類

按在磁盤上存儲的形式不同,可分為:

文本文件:

以ASCII字符存放—可見、可編輯、占空間大。

二進制文件:

以二進制形式存放—不可見、不可編輯、占空間小。

使用時可根據(jù)需要選擇。13.2文件類型指針

每個被使用的文件都在內(nèi)存中開辟一個區(qū),用來存放文件的有關(guān)信息(如文件名、文件狀態(tài)及文件當前位置等)。這些信息保存在一個FILE類型的結(jié)構(gòu)體變量中。

若FILE*fp;

則fp就稱為指向文件類型的指針變量。訪問文件通過文件指針進行。

FILE結(jié)構(gòu)體類型是由系統(tǒng)定義的。具體定義如下:

typedefstruct

{shortlevel;

緩沖區(qū)“滿”或“空”的程度

unsignedflags;

文件狀態(tài)標志

char

fd;

文件描述符

unsignedcharhold;

如無緩沖區(qū)不讀取字符

short

bsize;

緩沖區(qū)的大小

unsignedchar*buffer;

緩沖區(qū)的位置

unsignedchar*curp;

當前讀寫指針

unsigned

istemp;

臨時文件,指示器

short

token;

用于有效性檢驗

}FILE;13.3文件的打開與關(guān)閉

對文件的讀寫之前應“打開”該文件。使用結(jié)束后“關(guān)閉”此文件?!鑫募拇蜷_(fopen函數(shù))用fopen函數(shù)實現(xiàn)對文件的打開。

fopen函數(shù)調(diào)用的一般形式:

FILE*fp;

fp=fopen(文件名,讀寫方式);

例如:

fp=fopen(“a1”,”r”);

以只讀方式打開文件a1。fopen函數(shù)返回指向a1文件的指針,即fp是指向a1文件的指針變量,往后就可以通過fp訪問a1文件。文件讀寫方式:“r”

按只讀方式打開一個文本文件“w”

按只寫方式打開一個文本文件“a”

按追加方式打開一個文本文件“rb”

按只讀方式打開一個二進制文件“wb”

按只寫方式打開一個二進制文件“ab”

按追加方式打開一個二進制文件

“r+”

按讀寫方式打開一個文本文件“w+”

按讀寫方式建立一個新的文本文件“a+”

按讀寫方式打開一個文本文件“rb+”

按讀寫方式打開一個二進制文件“wb+”

按讀寫方式建立一個新的二進制文“ab+”

按讀寫方式打開一個二進制文件

說明:

(1)不能用”r”方式打開一個不存在的文件,”r”方式只讀不能寫。(2)“w”方式只寫不能讀,具有建立和覆蓋功能。(3)調(diào)用fopen函數(shù)時,如果返回NULL則表示打開不成功。■文件的關(guān)閉(fclose函數(shù))在使用完一個文件后應用fclose函數(shù)關(guān)閉文件,形式為:fclose(文件指針);如:

fclose(fp);

關(guān)閉后fp不再指向該文件。13.4文件的讀寫

文件打開后,就可以對它進行讀寫了?!鑫谋疚募淖x寫

即如何將以文本方式存放的文件輸入到程序的數(shù)據(jù)結(jié)構(gòu)中。如何將程序的數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)以文本方式輸出到文件中。

讀對象:以文本方式存放的文件

寫對象:以文本方式保存放的文件用于對文本文件讀寫的函數(shù)有:

fscanffprintffgetc,getcfputc,putcfgetsfputs

重點介紹fscanf和fprintf。以例子說明fscanf和fprintf的使用。

例:已知文本文件f1.dat中存放有100個學生的分數(shù),要求讀入這些數(shù)據(jù),并按從高到低的順序排序后輸出到另一文件中。#include“stdio.h”voidsort(int*a,intn){……}main(){

inti,a[100];FILE*fp;

fp=fopen(“f1.dat”,“r”);if(fp==NULL)exit(0);定義一個指向文件的指針變量打開文件,使fp指向文件f1.datfor(i=0;i<100;i++)fscanf(fp,”%d”,a+i);

fclose(fp);sort(a,100);fp=fopen(“f2.dat”,“w”);for(i=0;i<100;i++)fprintf(fp,”%4d”,a[i]);fclose(fp);}從fp所指的文件中讀數(shù)據(jù)關(guān)閉fp所指的文件注意:文本文件的輸入格式要與文件中的數(shù)據(jù)格式匹配。

■二進制文件的讀寫

即如何將以二進制方式存放的文件輸入到程序的數(shù)據(jù)結(jié)構(gòu)中。如何將程序的數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)以二進制方式輸出到文件中。讀對象:以二進制方式存放存放的文件寫對象:以二進制方式保存放的文件讀寫函數(shù):

freadfwritegetwputw例:將前例中的排序結(jié)果改用二進制方式輸出到文件f3.dat中。#include“stdio.h”voidsort(int*a,intn){……}main(){

inti,a[100];

FILE*fp;

fp=fopen(“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(“f3.dat”,“wb”);fwrite(a,sizeof(int),100,fp);fclose(fp);}數(shù)據(jù)的開始地址數(shù)據(jù)的每一項的長度數(shù)據(jù)的項數(shù)文件的指針如果要將二進制文件f3.dat讀到數(shù)組中,則有:#include“stdio.h”main(){

inta[100];FILE*fp;fp=fopen(“f3.dat”,“rb”);if(fp==NULL)exit(0);fread(a,sizeof(int),100,fp);fclose(fp);┊}13.5文件的定位

文件中有一個位置指針,指向當前讀寫位置。如果順序讀寫一個文件,每次讀寫完一個字符后,該位置指針自動指向下一個字符位置。如果想改變這樣的規(guī)律,強制使位置指針指向指定位置,可以用有關(guān)函數(shù)?!鰎ewind函數(shù)

rewind函數(shù)的作用是使位置指針重返回文件的開頭。

例:對文本文件f1.dat中的100個分數(shù)求超過平均分的人數(shù)。#include“stdio.h”main(){inti,a,n=0;floataver=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;i<100;i++){

fscanf(fp,”%d”,&score);if(score>aver)n++;}

fclose(fp);

printf(“\n%d”,n);}■fseek函數(shù)和隨機讀寫

使用fseek函數(shù)可以將位置指針指向所需的位置。

fseek函數(shù)調(diào)用的一般形式:

fseek(文件指針,位移量,參考點);以起始點為基準,向前移動的字節(jié)數(shù)0或SEEK_SET文件開始1或SEEK_CUR當前位置2或SEEK_END文件末尾例:如果fp是指向一個存放100個整數(shù)的二進制文件,要讀取第50個數(shù)到變量n時:

fseek(fp,sizeof(int)*(50-1),SEEK_SET);

fread(&n,sizeof(int),1,fp);例:如果fp是指向一個存放100個整數(shù)的文本文件,并已知每個數(shù)按3位數(shù)字的定長格式存放,要讀取第50個數(shù)到變量n時:

fseek(fp,3*(50-1),SEEK_SE);

fscanf(fp,”%3d”,&n);若要從當前位置跳過10個數(shù)后讀取一個數(shù):

fseek(fp,3*10,SEEK_CUR);fscanf(fp,”%3d”,&n);

例:已知文本文件f5.dat中存放有100個學生的學號、姓名和考試成績;要求從鍵盤輸入任一學號,檢索出相應學生的數(shù)據(jù)。說明:(1)文件f5.dat中每行為一個學生的數(shù)據(jù),按定長格式存放,依次為:學號(整數(shù),占5格)、姓名(占10格)、成績(整數(shù),占4格)。(2)按學號從小到大的順序連號存放,起始學號為1001。#include“stdio.h”typedefstruct{

intnum;charname[20];

intscore;}STU;main(){

intno;

STUst;

FILE*fp;fp=fopen(“f5.dat”,”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);}

1001LiLi901002WangPing1001003HuHeng75

如果是二進制文件呢?上例的檢索方法稱為“定位檢索”。如果是非定長格式,則需要用“遍歷檢索”。

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.dat中存放有武漢市所有公民的有關(guān)性別和年齡的數(shù)據(jù),請編寫程序分別找出其中10名男壽星和10名女壽星,并將20名壽星的數(shù)據(jù)以文本文件的方式存入到文件f2.dat中(先男后女)。

說明:①

文件f1.dat中每行為一個公民的數(shù)據(jù),共有3項,依次為:姓名(不超過10個字符)、性別(0表示男,1表示女)和年齡(整數(shù)),項間以空格分隔。②

未給出公民個數(shù),將文件中的數(shù)據(jù)讀完為止。算法思想:開辟一個存放20名壽星數(shù)據(jù)的結(jié)果表a(結(jié)構(gòu)體數(shù)組),然后逐個讀取公民數(shù)據(jù),每讀取一個就向a中“判斷插入”一個,男性公民往前段插,女性公民往后段插。讀一個公民的數(shù)據(jù)到p讀完否?NYWanghao0100Liming098┊wudan199xiaofang195┊男性插入女性插入壽星表a#include<stdio.h>typedefstruct

{charname[10];

intsex;

intage;}PEP;插入函數(shù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論