C語言程序設(shè)計教程(第2版)-課件 第10章 文件_第1頁
C語言程序設(shè)計教程(第2版)-課件 第10章 文件_第2頁
C語言程序設(shè)計教程(第2版)-課件 第10章 文件_第3頁
C語言程序設(shè)計教程(第2版)-課件 第10章 文件_第4頁
C語言程序設(shè)計教程(第2版)-課件 第10章 文件_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

10.1文件的有關(guān)概念

實際應用中,信息的輸入與輸出不僅是鍵盤,而大量的信息輸入和輸出需要外存,外存是以文件的形式存儲的.文件:存放在外部介質(zhì)上數(shù)據(jù)集合

C語言執(zhí)行程序輸入數(shù)據(jù)10.1.1什么是文件

文件:存儲在外部介質(zhì)上數(shù)據(jù)的集合,是操作系統(tǒng)數(shù)據(jù)管理的單位。特點:數(shù)據(jù)永久存放,需要時被方便的訪問。為標識一個文件,每個文件都必須有一個文件名,其一般結(jié)構(gòu)為:主文件名[.擴展名]例如,一個TC語言源程序名為:prg.cTC語言的目標文件名:prc.obj

TC語言的可執(zhí)行文件名:prc.exe10.1.2文件的分類

根據(jù)數(shù)據(jù)的組織形式分類:文本文件:ASCII文件,每個字節(jié)存放一個字符的ASCII碼,代表一個字符.二進制文件:數(shù)據(jù)按其在內(nèi)存中的存儲形式原樣存放例如整數(shù)inta=1025,這兩種文件的存儲形式是不同的.兩種文件在內(nèi)存中的存放形式:0011001100110010001101110011011000110111文本文件1111111101111111shortint

數(shù)據(jù)32767'3'

'2'

'7'

'6'

'7'

32767的各字符的ASCII碼存放形式0111111111111111二進制文件32767的二進制存放形式內(nèi)存存放形式文本文件特點:存儲量大、速度慢、便于對字符操作二進制文件特點:存儲量小、速度快、便于存放中間結(jié)果兩種文件在內(nèi)存中的存放形式:高位低位

二進制文件的存儲形式與數(shù)據(jù)在內(nèi)存中的存儲形式相同,讀寫是位復制,不需要轉(zhuǎn)換,傳輸效率高,節(jié)省外存空間。

ASCII碼文件是以字符形式存儲,讀寫需要轉(zhuǎn)換,傳輸效率低,占用外存空間較大。兩種存儲格式的區(qū)別:中間結(jié)果數(shù)據(jù)一般用二進制文件方式保存.供用戶閱讀的數(shù)據(jù)需要用ASCII瑪形式存放

寫文件是從內(nèi)存向磁盤輸出數(shù)據(jù)。首先將內(nèi)存中的數(shù)據(jù)送到文件緩沖區(qū),待文件緩沖區(qū)滿,寫入磁盤。

10.1.3文件緩沖區(qū)

讀文件是從磁盤讀出數(shù)據(jù)存入內(nèi)存。首先從磁盤讀出一批數(shù)據(jù)送到文件緩沖區(qū),然后從文件緩沖區(qū)取出數(shù)據(jù)存入內(nèi)存。ANSIC標準采用”緩沖文件系統(tǒng)”處理文件,所謂緩沖文件系統(tǒng)是指系統(tǒng)自動第在內(nèi)存區(qū)為每一個正在使用的文件開辟一個”文件緩沖區(qū)”.10.1.4文件指針

每個被使用的文件都在內(nèi)存中開辟一個相應的文件信息區(qū),用來存放文件的有關(guān)信息(文件名\文件狀態(tài)及文件當前位置等),這些信息保存在一個結(jié)構(gòu)體變量中.typedefstruct{intlevel;/*緩沖區(qū)的空滿程度*/unsignedflags;/*文件狀態(tài)標志*/charfd;/*文件描述符*/unsignedcharhold;/*如無緩沖區(qū)不讀取字符*/intbsize;/*緩沖區(qū)大小*/unsignedchar_FAR*buffer;/*數(shù)據(jù)緩沖區(qū)位置*/unsignedchar_FAR*curp;/*指針,當前的指向*/unsignedistemp;/*臨時文件,指示器*/shorttoken;/*有效性檢驗*/}FILE;/*指定新類型名為FILE*/stdio.h中定義)fp是一個指向FILE類型結(jié)構(gòu)體的指針變量??梢允筬p指向某一個文件的結(jié)構(gòu)體變量,從而通過該結(jié)構(gòu)體變量中的文件信息能夠訪問該文件。也就是說,通過文件指針變量能夠找到與它相關(guān)的文件。定義文件型指針變量FILE*fp;10.2文件的打開與關(guān)閉

和其他高級語言一樣,對文件讀寫之前應該“打開”該文件,在使用結(jié)束之后應關(guān)閉該文件?!按蜷_”:是指為文件建立相應的信息區(qū)(用來存放有關(guān)文件的信息)和文件緩沖區(qū)(用來存放輸入輸出的數(shù)據(jù)),并建立文件與它們之間的聯(lián)系.“關(guān)閉”:只指撤消文件信息區(qū)和文件緩沖區(qū),斷開文件與內(nèi)存之間的聯(lián)系.10.2.1文件的打開FILE*fp;/*定義文件型指針變量*/fp=fopen(文件名,使用文件方式);/*使指針變量指向打開的文件的信息區(qū)*/例如:fp=fopen("a1","r");/*表示要打開名字為a1的文件,使用文件方式為“讀入”,同時帶回指向a1文件的指針并賦給fp,這樣fp和文件a1相聯(lián)系了*/.fp文件緩沖區(qū)

FILE類型存放著處理文件的有關(guān)信息FILE*fp1,*fp2,*fp3;fp1=fopen(“abc”,”r”);fp2=fopen(“d:\\mydoc\\stu.dat”,”r”);fp3=fopen=(“a1.txt”,”r”);路徑分割符”\\”打開文件時通知編譯系統(tǒng)三個信息:需要打開的文件名、文件的使用方法、文件指針【實例10-1】打開文件例如:if((fp=fopen("e:\001\file1.txt","w"))==NULL){printf("file1.txt不能打開!\n");exit(1);}

對于讀寫模式,打開文件時,當前文件指針指向文件開始。追加模式,打開文件時,當前文件指針指向文件末尾。要特別注意,打開已存在文件,如果錯選w模式或wb模式,文件中的數(shù)據(jù)全部丟失。如果函數(shù)調(diào)用成功,fopen函數(shù)的返回值是指向該文件的指針,程序可以使用這個指針對所打開的文件進行讀寫操作。否則返回一個空指針—NULL;

文件使用方式含義 “r”只讀

為輸入打開一個文本文件進行讀操作 “w” 只寫 為輸出打開一個文本文件進行寫操作 “a”追加

向文本文件尾追加數(shù)據(jù) “rb” 只讀 為輸入打開一個二進制文件進行讀操作 “wb” 只寫 為輸出打開一個二進制文件進行寫操作 “ab” 追加 向二進制文件尾追加數(shù)據(jù) “r+”讀寫

為讀/寫打開一個文本文件 “w+”讀寫

為讀/寫建立一個新的文本文件 “a+” 讀寫 同”r+” “rb+” 讀寫 為讀/寫打開打開一個二進制文件 “wb+” 讀寫 為讀/寫建立一個新的二進制文件,若文件不存在則創(chuàng)建“ab+” 讀寫 同”r+”

文件使用方式:指針指向文件開始指針指向末尾文件的關(guān)閉(fclose函數(shù))

fclose函數(shù)用來關(guān)閉fp所指向的文件。該文件必須是用fopen函數(shù)打開的。如果關(guān)閉成功則返回1,否則返回0。fclose函數(shù)的一般使用方式:

fclose(文件指針);10.2.2文件的關(guān)閉main(){FILE*fp;fp=fopen(“d:\\text.c",“w");if(fp==NULL) {printf("cannotopenthisfile!\n");exit(0);}fclose(fp);}進行讀寫操作如果打開文件失敗,則退出程序關(guān)閉文件【實例10-2】關(guān)閉文件10.3文件的讀寫

10.3.1字符讀寫函數(shù):fgetc和fputcfputc函數(shù)的功能是將一個字符寫入文件的當前位置。一般使用形式為:

fputc(ch,fp);其中ch是要輸出的字符fp是文件指針變量,它從函數(shù)得到返回值。

功能:將字符數(shù)據(jù)c輸出到fp所指向的文件中去,同時將讀寫位置指針向前移動1個字節(jié)(即指向下一個寫入位置)。

返值:正常,返回ch;出錯,為EOFfgetc函數(shù)從文件中讀取當前位置的一個字符返回。其一般形式為:

ch=fgetc(fp);字符變量文件型指針變量

功能:從fp指向的文件中,讀入一個字節(jié)(字符),同時將讀寫位置指針向前移動1個字節(jié)(即指向下一個字符)

返值:正常,返回讀到的代碼值;讀到文件尾或出錯,為EOF

在文件內(nèi)部有一個位置指針。用來指向文件的當前讀寫字節(jié)。在文件打開時,該指針總是指向文件的第一個字節(jié)。使用fgetc

函數(shù)后,

該位置指針將向后移動一個字節(jié)。

因此可連續(xù)多次使用fgetc函數(shù),讀取多個字符。

10.3.2文件位置指針□□□□□□□□文件指針位置指針#include"stdilb.h"main(){charfilename[20];

FILE*fp;charch;scanf("%s",filename);if((fp=fopen(filename,"w"))==NULL){printf("can'tcreatethefile\n");exit(0);}while((ch=getchar())!='#')fputc(ch,fp);fclose(fp);}輸入要打開的文件名以“w”方式打開文件從鍵盤輸入字符,直到輸入”#“結(jié)束寫入文件打開的文件中【實例10-3】

:讀入字符并存入文件,直到用戶輸入一個“#”符為止。#include"stdlib.h"main(){FILE*fp;charch;if((fp=fopen("d:\\my.dat","rb"))==NULL){printf("\nthisfiledoesnotexit\n");exit(1);}while((ch=fgetc(fp))!=EOF)putchar(ch);fclose(fp);}以“r”方式打開文件從My.dat文件中讀字符,直到遇到文件結(jié)束符EOF【實例10-4】從一個磁盤文件順序讀入字符并在屏幕上顯示出來。C語言中使用feof()函數(shù)來判斷文件是否結(jié)束。如果是文件結(jié)束,函數(shù)feof(fp)的值為1(真),否則為0(假)。10.3.3文件結(jié)束判斷函數(shù)

FILE*fp;charch;if(!eof(fp))ch=fgetc(fp);#include"stdio.h“#inlude“stdlib.h”

main()

{

FILE*fp;

intch;

if((fp=fopen("d:\\my.dat","r"))==NULL)

{printf("\nthisfiledoesnotexit\n");

exit(1);}

while(!feof(fp))

{ch=fgetc(fp);

putchar(ch);}

fclose(fp);

}【實例10-5】用feof(fp)函數(shù)判斷文件是否結(jié)束【實例10-6】打開一個ASCII文件,將文件內(nèi)容顯示到顯示器上。然后輸入一行字符串,將其保存到該文件中。#include"stdio.h“#include“stdlib.h”main(){FILE*fp;charc,str[100],filename[30],i=0;scanf("%s",filename);if((fp=fopen(fliename,"r+"))==NULL){printf("filecan’topen!\n");exit(0);};while((c=fgetc(fp))!=EOF)putchar(c);gets(str);while(str[i]!='\0'){fputc(str[i],fp);i++;}fclose(fp);} 10.3.4字符串的讀寫函數(shù)fputs和fgetsfputs函數(shù)

調(diào)用的一般格式:fputs(字符串,文件指針);功能:它將一個字符串寫到指定的磁盤文件。:寫成功,返回0;寫失敗,返回EOF(-1)。fgets函數(shù)

調(diào)用的一般格式:fgets(字符串,字符個數(shù),文件指針);功能:它從指定的磁盤文件中讀一字符串讀成功,返回字符串的首地址;讀失敗或遇到文件結(jié)束符,返回EOF(-1)從fp所指文件讀n-1個字符送入內(nèi)存區(qū),并在最后加一個‘\0’(若讀入n-1個字符前遇換行符或文件尾(EOF)即結(jié)束)#include"stdio.h"

#include“stdlib.h”main()

{FILE*fp;

charstr[11];

if((fp=fopen("d:\\inf.c","r"))==NULL)

{

printf("Cannotopenfile");

exit(1);

}

fgets(str,11,fp);

printf("%s",str);

fclose(fp);}【實例10-7】從某個已經(jīng)存在的文件中讀取一個含有10個字符的字符串。#include<stdio.h>#include<stdlib.h>intmain(){FILE*fp1,*fp2;charstr[]="123456789";

//創(chuàng)建文本文件wang.txt

fp1=fopen("wang.txt","w"); if(fp1==NULL)//創(chuàng)建文件失敗

{printf("cannotopenfile:wang.txt\n");exit(0);}//將字符串“123456789”寫入文件

fputs(str,fp1);//寫入第一行文本的換行符和下一行文本

fputs("\nabcd",fp1);fclose(fp1);//關(guān)閉文件wang.txtfp1【實例10-8】向文件wang.txt中寫入兩行文本,然后分三次讀出其內(nèi)容。

3132333435363738390D0A61626364"123456789"回車換行符’\n’“abcd"

fp2=fopen("wang.txt","rt");//以只讀方式打開wang.txt文件

fgets(str,8,fp2);//讀取字符串,最大長度是7,將是"1234567"printf("%s\n",str);fgets(str,8,fp2);//讀取字符串,最大長度是7,實際上將是"89\n"printf("%s\n",str);fgets(str,8,fp2);//讀取字符串,最大長度是7,實際上將是"abcd"printf("%s\n",str);fclose(fp2);//關(guān)閉打開的文件}wang.txt3132333435363738390D0A61626364fp2位置指針位置指針運行結(jié)果:1234567第一次讀取"1234567"位置指針第二次讀取“89\n"位置指針89第三次讀取“abcd"abcd有以下程序運行后,文件t1.dat中的內(nèi)容是_____

#include

intwriteStr(char*fn,char*str)

{FILE*fp;

fp=fopen(fn,"w");fputs(str,fp);fclose(fp);

}

main()

{

writeStr("t1.dat","start");

writeStr("t1.dat","end");

}

A)startB)endC)startendD)endrt將一個磁盤文件中的信息讀到屏幕上,請?zhí)羁铡?include"stdio.h"main(){FILE*fp1,*fp2;fp1=fopen("file1.c","r");fp2=fopen("file2.c","w");while(!feof(fp1))putchar(________)fclose(fp1);}A)p2B)getc(fp1)C)fputc(fp1)D)ch答案:B功能:按指定的格式將內(nèi)存中的數(shù)據(jù)轉(zhuǎn)換成對應的字符,以ASCII碼形式輸出到文本文件中。例如:

fprintf(fp,"%d%d",x,y);把x,y中的數(shù)按%d格式輸出到fp所指的文件中。fprintf(文件指針,"格式控制字符串",輸出項表)調(diào)用形式:10.3.5信息的格式化讀/寫1.fprintf()函數(shù)2.fscanf函數(shù)功能:從文本文件中按格式輸入。例如:

fscanf(fp,"%d%d",&a,&b);從fp所指文件中讀入兩個整數(shù),放入變量a,bfscanf(文件指針,"格式控制字符串",輸入項表)調(diào)用形式:#include<stdio.h>#include<stdlib.h>intmain(){inti=3;floatf=(float)9.8;FILE*fp;//創(chuàng)建文本文件wang.txtfp=fopen("wang.txt","w");if(fp==NULL)//創(chuàng)建失敗

{printf("can'tcreatefile:wang.dat\n");exit(0);}//將變量i和f的值格式化輸出到文件中

fprintf(fp,"%2d,%6.2f",i,f);fclose(fp);//關(guān)閉文件wang.txtfp【實例10-9】將變量的值格式化寫入文件中,然后從文件中格式化讀出并顯示。

20332C2020392E3830ASCII碼對應字符'''3'',''''''9''.''8''0'%2d%6.2f#include"stdio.h"structstu{charname[10];intnum;intage;charaddr[15];}s[5],*p;main(){FILE*fp;charch;inti;p=s;if((fp=fopen("stu_list","wb+"))==NULL){printf("Cannotcreatefile!");exit(0);}例:從鍵盤輸入5個學生數(shù)據(jù),寫入一個文件中,再讀出數(shù)據(jù)顯示。printf("\ninputdata\n");for(i=0;i<5;i++,p++)scanf("%s%d%d%s",p->name,&p->num,&p->age,p->addr);p=s;for(i=0;i<5;i++,p++)fprintf(fp,"%s%d%d%s\n",p->name,p->num,pp->age,p->addr);rewind(fp);/*使文件位置指針重新返回文件的開頭*/for(p=s,i=0;i<5;i++,p++)fscanf(fp,"%s%d%d%s\n",p->name,&p->num,&p->age,p->addr);printf("\n\nname\tnumberageaddr\n");for(p=s,i=0;i<5;i++,p++)printf("%s\t%5d%7d%s\n",p->name,p->num,p->age,p->addr);fclose(fp);}1.fread函數(shù)的使用fread(buffer,size,count,fp);調(diào)用形式:數(shù)據(jù)塊的指針,存放讀入數(shù)據(jù)的起始地址每個數(shù)據(jù)塊的字節(jié)數(shù)數(shù)據(jù)塊個數(shù)文件指針功能:從fp所指向文件的當前位置開始,一次讀入size個字節(jié),重復count次,并將讀入的數(shù)據(jù)存放到從buffer開始的內(nèi)存中;同時,將讀寫位置指針向前移動size*count個字節(jié)。10.3.6.fread()、fwrite()函數(shù)fwrite(buffer,size,count,fp);數(shù)據(jù)塊的指針,存放輸出數(shù)據(jù)的起始地址每個數(shù)據(jù)塊的字節(jié)數(shù)數(shù)據(jù)塊個數(shù)文件指針功能:從

buffer

開始,一次輸出

size

個字節(jié),重復

count

次,并將輸出的數(shù)據(jù)存放到

fp

所指向的文件中;同時,將讀寫位

溫馨提示

  • 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

提交評論