C程序設(shè)計(jì)文件的輸入輸出_第1頁
C程序設(shè)計(jì)文件的輸入輸出_第2頁
C程序設(shè)計(jì)文件的輸入輸出_第3頁
C程序設(shè)計(jì)文件的輸入輸出_第4頁
C程序設(shè)計(jì)文件的輸入輸出_第5頁
已閱讀5頁,還剩30頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

會(huì)計(jì)學(xué)1C程序設(shè)計(jì)文件的輸入輸出2二進(jìn)制文件把數(shù)據(jù)按其在內(nèi)存中的形式存儲(chǔ)在文件中,信息在文件中的表示形式與在計(jì)算機(jī)內(nèi)存中的表示形式完全一樣,文件中的數(shù)據(jù)信息可以被分成一個(gè)個(gè)字節(jié),但通常是由若干字節(jié)構(gòu)成一個(gè)有意義的數(shù)據(jù)信息。例如,由4個(gè)字節(jié)信息構(gòu)成一個(gè)整數(shù)。

正文文件與二進(jìn)制文件的區(qū)別1.存儲(chǔ)數(shù)值型數(shù)據(jù)的形式不同。例如:整數(shù)10000在內(nèi)存中用4個(gè)字節(jié)表示,保存到正文文件中要占5個(gè)字節(jié);保存到二進(jìn)制文件中只占4個(gè)字節(jié)。2.正文文件的數(shù)據(jù)是字符,便于閱讀。但二進(jìn)制文件中的信息難以理解。文件類型第1頁/共35頁3緩沖區(qū)操作系統(tǒng)為能高效地管理和控制設(shè)備,給程序正在使用的每個(gè)文件在內(nèi)存中開辟一個(gè)適當(dāng)大小的緩沖區(qū)。

程序要從文件讀入一些信息時(shí),系統(tǒng)先一次性地讀入足夠多的信息存于緩沖區(qū)中,供程序一部分一部分地使用。程序要寫信息到文件時(shí),也先把信息寫到緩沖區(qū)中,待緩沖區(qū)寫滿或?qū)懳募Y(jié)束時(shí),才把緩沖區(qū)中的內(nèi)容寫到文件中。程序要讀寫文件中的數(shù)據(jù),首先打開要讀寫的文件(寫文件時(shí)可能要新建文件),然后才能對該文件讀寫數(shù)據(jù),并在使用結(jié)束時(shí)關(guān)閉文件。程序與文件交換數(shù)據(jù)的實(shí)現(xiàn)過程第2頁/共35頁4文件類型

FILE

用于存放有關(guān)對文件進(jìn)行操作所需的控制信息結(jié)構(gòu),如文件名、文件讀寫狀態(tài)、文件緩沖區(qū)大小和位置、當(dāng)前讀寫位置等。文件類型由系統(tǒng)預(yù)定義。文件類型指針變量

FILE*fp;

程序在使用文件前,先調(diào)用打開函數(shù)。打開函數(shù)為文件指定一個(gè)FILE類型的結(jié)構(gòu),并返回該結(jié)構(gòu)的指針。系統(tǒng)通過指向該結(jié)構(gòu)的指針才能正確讀寫文件。有了文件指針變量,使得C程序能找到與它對應(yīng)的文件。在程序中若要訪問n個(gè)文件,一般應(yīng)設(shè)n個(gè)文件指針變量。文件類型指針變量第3頁/共35頁51.文件打開函數(shù)

fopen()形式:fopen(文件名,使用方式)功能:分配一個(gè)存放文件控制信息的結(jié)構(gòu),并返回這個(gè)結(jié)構(gòu)的指針。其中:文件名(包括目錄路徑)為字符串表達(dá)式。函數(shù)返回值:如果打開成功,函數(shù)返回文件指針;打開不成功,返回NULL。例如:fp=fopen("\\usr4\\smp.dat","w");表示:以寫方式打開根目錄下的usr4子目錄中的smp.dat文件。第1個(gè)\為轉(zhuǎn)義字符8.2常用的數(shù)據(jù)文件庫函數(shù)第4頁/共35頁6

可能會(huì)因某種原因不能打開文件。例如,讀文件方式打開一個(gè)不存在的文件;在寫文件方式下,外部存儲(chǔ)介質(zhì)無剩余的自由空間,或外設(shè)故障;或超過系統(tǒng)能同時(shí)打開的文件數(shù)等。

文件不能打開時(shí),函數(shù)fopen()將返回空指針值NULL。程序應(yīng)考慮到文件不能正常打開的極端情況,應(yīng)用以下形式的代碼描述打開一個(gè)文件的要求:

if((fp=fopen(fname,"r"))==NULL){printf("不能打開文件%s。\n",fname);return;}

1.

文件打開函數(shù)

fopen()第5頁/共35頁7文件使用方式 意義

"r"

只讀,為讀打開正文文件

"w"

只寫,為寫打開正文文件

"a"

追加,從正文文件尾開始寫

"rb"

只讀,為讀打開二進(jìn)制文件

"wb"

只寫,為寫打開二進(jìn)制文件

"ab"

追加,從二進(jìn)制文件尾開始寫

"r+"

讀寫,為讀/寫打開正文文件

"w+"

讀寫,為讀/寫建立并打開新的正文文件

"a+"

讀寫,為讀/寫打開正文文件 表8-1文件使用方式第6頁/共35頁8形式:fclose(fp)功能:使文件指針變量fp終止原先調(diào)用函數(shù)fopen()時(shí)所建立的與文件的聯(lián)系。函數(shù)返回值:如果關(guān)閉成功,函數(shù)返回0;如果檢測到錯(cuò)誤,返回EOF(在stdio.h文件中定義為–1)。例如:fclose(fp);說明:

1.文件被關(guān)閉后,不能再通過該文件指針變量對其原先相連的文件進(jìn)行讀寫操作,除非被再次打開。

2.文件被關(guān)閉后,原文件指針變量又可用來打開其他文件,與其他文件建立新的相聯(lián)系。2.文件關(guān)閉函數(shù)fclose()第7頁/共35頁9形式:fgetc(fp)功能:從文件指針fp指向的文件讀入一個(gè)字符(類似于getchar函數(shù))。函數(shù)返回值:讀入成功,返回讀入的字符;讀入時(shí)遇到文件結(jié)束,則返回文件結(jié)束標(biāo)記EOF。例如:ch=fgetc(fp);表示:從fp所指文件讀入一個(gè)字符存于變量ch。3.從文件讀一個(gè)字符函數(shù)fgetc()第8頁/共35頁10形式:fputc(ch,fp)功能:將ch中的字符輸出到文件指針fp指向的文件中(類似于putchar函數(shù))。函數(shù)返回值:輸出成功,返回輸出的字符;輸出失敗則返回EOF。例如:fputc('A',fp);表示:將大寫字母A寫到fp指向的文件中。4.寫一個(gè)字符到文件函數(shù)fputc()第9頁/共35頁11【例1】從鍵盤上輸入字符,依次送入指定的文件,直到輸入一個(gè)"#"為止。

#include<stdio.h>voidmain(){FILE*fp;charch,fname[40];printf("輸入文件名:");scanf("%s",fname);

fp=fopen(fname,"w");fflush(stdin);/*清輸入緩沖區(qū)*/printf("開始輸入字符串:\n");ch=getchar();while(ch!='#'){fputc(ch,fp);ch=getchar();}fclose(fp);/*關(guān)閉文件*/}fputc()和fgetc()函數(shù)-例1設(shè)運(yùn)行情況如下:輸入文件名:d:\file1.txt開始輸入字符串:FudanUniversity.Shanghai,China.#第10頁/共35頁12【例2】將一個(gè)文件中的數(shù)據(jù)復(fù)制到另一個(gè)文件中。

#include<stdio.h>voidmain(){FILE*in,*out;charch,infile[40],outfile[40];printf("輸入源文件名:");gets(infile);/*或scanf("%s%*c",infile);*/if((in=fopen(infile,"r"))==NULL){printf("不能打開源文件

%s\n",infile);scanf("%*c");/*起暫停作用*/return;}fputc()和fgetc()函數(shù)-例2第11頁/共35頁13printf("輸入目標(biāo)文件名:");gets(outfile);out=fopen(outfile,"w");while((ch=fgetc(in))!=EOF)fputc(ch,out);fclose(in);fclose(out);}fputc()和fgetc()函數(shù)-例2設(shè)運(yùn)行情況如下:輸入源文件名:d:\file1.txt輸入目標(biāo)文件名:d:\file2.txt第12頁/共35頁14形式:fprintf(文件指針,格式字符串,輸出項(xiàng)表)

功能:作用類似于printf函數(shù)。函數(shù)返回值:輸出成功,返回實(shí)際輸出的字符數(shù);輸出失敗則返回EOF。例如:fprintf(wp,"i=%dr=%6.4f\n",i,r);表示:將整型變量i和實(shí)型變量r的值按格式輸出到wp指向的文件中。5.格式輸出函數(shù)fprintf()

第13頁/共35頁15形式:fscanf(文件指針,格式字符串,輸入項(xiàng)地址表)

功能:作用類似于scanf函數(shù)。函數(shù)返回值:讀取成功,返回實(shí)際讀入數(shù)據(jù)的個(gè)數(shù);讀入失敗則返回EOF。例如:fscanf(rp,"%d%f",&i,&r);表示:從rp指向的文件上為整型變量i和浮點(diǎn)型變量r讀入數(shù)據(jù)。6.格式輸入函數(shù)fscanf()

第14頁/共35頁16形式:fgets(str,n,fp)功能:從指定的文件讀取n-1個(gè)字符,并存入字符數(shù)組str中(類似gets函數(shù))。函數(shù)返回值:讀取成功,返回str的首地址;讀入失敗則返回NULL地址。說明:1.當(dāng)連續(xù)讀入n-1個(gè)字符,或遇到換行符,或遇到文件結(jié)束時(shí),讀字符過程結(jié)束。

2.字符串讀入后,在最后自動(dòng)加一個(gè)'\0'。例如:chara[80];FILE*in;while(!feof(in))printf("%s",fgets(a,80,in));表示:將文件內(nèi)容一行一行地輸出。7.從文件讀字符串函數(shù)fgets()第15頁/共35頁17形式:fputs(str,fp)功能:將字符串輸出到fp指向的文件(類似puts函數(shù))。其中:str可以是字符串常量、字符數(shù)組或字符指針。函數(shù)返回值:輸出成功,返回最后輸出的字符;輸出失敗,返回EOF。例如:fputs("China",fp);表示:將字符串"China"輸出到fp指向的文件。8.

寫字符串到文件函數(shù)fputs()第16頁/共35頁18形式:rewind(fp)功能:將fp指向的文件中的當(dāng)前讀寫位置回到文件之首。函數(shù)返回值:無。9.

回到文件頭函數(shù)rewind()第17頁/共35頁19形式:fseek(fp,offset,ptname)功能:將文件的當(dāng)前位置任意移動(dòng),實(shí)現(xiàn)隨機(jī)讀寫。其中:ptname為文件讀寫的起始位置,只允許0、1或2。0表示文件首(或用SEEK_SET表示);1表示當(dāng)前位置(或用SEEK_CUR表示);2表示文件尾(或用SEEK_END表示)。

offset為long型的位移量,以ptname為基準(zhǔn),移動(dòng)的字節(jié)數(shù)。函數(shù)返回值:成功移動(dòng)返回0,否則返回非0。10.

文件當(dāng)前位置移動(dòng)函數(shù)fseek()第18頁/共35頁20【例1】fseek(fp,40L,SEEK_SET);

表示:將當(dāng)前位置移到離文件頭40個(gè)字節(jié)處?!纠?】fseek(fp,20L,SEEK_CUR);

表示:將當(dāng)前位置移到離當(dāng)前位置20個(gè)字節(jié)處?!纠?】fseek(fp,-30L,SEEK_END);

表示:將當(dāng)前位置移到文件尾后退30個(gè)字節(jié)處。

說明:fseek一般用于二進(jìn)制文件的隨機(jī)讀寫。10.

函數(shù)fseek-例第19頁/共35頁21形式:ftell(fp)功能:得到fp指向文件當(dāng)前位置相對于文件首的偏移字節(jié)數(shù)。函數(shù)返回值:文件首到文件當(dāng)前讀寫位置的距離(字節(jié)數(shù))。例如:fseek(fp,0L,SEEK_END);

/*當(dāng)前位置移到文件尾*/ len=ftell(fp);

/*求文件的長度*/11.

文件頭到當(dāng)前位置距離函數(shù)ftell()第20頁/共35頁22形式:fread(buffer,size,count,fp)功能:從fp指向的文件讀入count*size個(gè)字節(jié),存入buffer。函數(shù)返回值:讀取成功返回count值,否則返回0。說明:常用于二進(jìn)制文件的讀。其中:buffer:字符數(shù)組名或指針

size:讀寫數(shù)據(jù)塊的字節(jié)數(shù)

count:讀寫數(shù)據(jù)塊的個(gè)數(shù)

fp:文件指針12.成批讀數(shù)據(jù)函數(shù)fread()第21頁/共35頁23形式:fwrite(buffer,size,count,fp)功能:從buffer中取出數(shù)據(jù),向fp指向的文件寫count*size個(gè)字節(jié)。函數(shù)返回值:寫文件成功返回count值,否則<count。說明:常用于二進(jìn)制文件的寫。其中:buffer:字符數(shù)組名或指針

size:讀寫數(shù)據(jù)塊的字節(jié)數(shù)

count:讀寫數(shù)據(jù)塊的個(gè)數(shù)

fp:文件指針13.

文件頭到當(dāng)前位置距離函數(shù)fwrite()第22頁/共35頁24

一個(gè)完整的文件處理程序,必須包含下列內(nèi)容:(1)在程序的開始處定義文件指針變量,和存儲(chǔ)文件名的字符數(shù)組。例如:#include<stdio.h> FILE*fp; /*定義文件指針變量fp*/ charfname[40]; /*存儲(chǔ)文件目錄路徑*/(2)用類似下面的代碼輸入文件名。

printf("請輸入文件名(包括文件的目錄路徑、文件的擴(kuò)展名)\n"); scanf("%s%*c",fname);/*輸入文件名及其隨后的回車符*/說明:可以使用gets(fname);來代替scanf。8.3文件處理程序結(jié)構(gòu)第23頁/共35頁258.3文件處理程序結(jié)構(gòu)(3)使用文件前,按使用要求先打開文件。例如:if((fp=fopen(fname,"r"))==NULL){

/*以讀文件方式打開*/printf(”%s文件不能打開,結(jié)束程序的執(zhí)行\(zhòng)n”,fname);return;}說明:1.

如果要向文件寫數(shù)據(jù),應(yīng)使用寫文件打開:

fp=fopen(fname,"w");/*以寫文件方式打開*/ 2.讀打開時(shí),要求被打開文件已存在。寫打開時(shí),如果被打開文件不存在,則建立一個(gè)以fname內(nèi)容命名的新文件;如果被打開文件已存在,則該文件上的數(shù)據(jù)被清除。第24頁/共35頁268.3文件處理程序結(jié)構(gòu)(4)文件使用結(jié)束后,要及時(shí)關(guān)閉。例如:fclose(fp);/*以后fp又可用于打開文件*/(5)調(diào)用庫函數(shù)對數(shù)據(jù)文件進(jìn)行輸入輸出。見8.2介紹的文件庫函數(shù)。第25頁/共35頁27#include<stdio.h>FILE*fp;voidmain(){intx,k;charfname[40];printf("輸入文件名:");scanf("%s%*c",fname);fp=fopen(fname,"w");k=1;while(scanf("%d",&x)==1){/*能正確輸入整數(shù)循環(huán)*/fprintf(fp,"%d\t",x);if(k++%5==0)fprintf(fp,"\n");}fclose(fp);printf("\n共輸出了%d個(gè)整數(shù)到文件%s.\n",k-1,fname);}【例8.1】從鍵盤輸入整數(shù)序列,

并按輸入順序輸出到指定文件輸入文件名:d:\file1.txt12345678a共輸出了8個(gè)整數(shù)到文件d:\file1.txt第26頁/共35頁28#include<stdio.h>FILE*fp;intmain(){intx,k;charfname[40];printf("輸入文件名:");scanf("%s%*c",fname);if((fp=fopen(fname,"r"))==NULL){/*以輸入方式打開正文文件*/printf("不能打開文件%s。\n",fname);return0;}【例8.2】從指定的文件輸入整數(shù),

并按輸入順序輸出到顯示屏上第27頁/共35頁29k=1;while(fscanf(fp,"%d",&x)==1){printf("%d\t",x);if(k++%5==0)printf("\n");}fclose(fp);printf("\n從文件%s輸入了%d個(gè)整數(shù).\n",fname,k-1);return1;}【例8.2】從指定的文件輸入整數(shù),

并按輸入順序輸出到顯示屏上輸入文件名:d:\file1.txt12345678從文件d:\file1.txt輸入了8個(gè)整數(shù).第28頁/共35頁30#include<stdio.h>FILE*fp;voidmain(){intch;charfname[40];printf("輸入文件名:");scanf("%s%*c",fname);fp=fopen(fname,"w");

【例8.3】逐行復(fù)制從鍵盤輸入字符到指定文件,

直至輸入空行結(jié)束第29頁/共35頁31while((ch=getchar())!='\n'){/*逐行處理,至空行結(jié)束*/dofputc(ch,fp);/*行內(nèi)字符逐一復(fù)制*/while((ch=getchar())!='\n');/*處理當(dāng)前行*/fputc(ch,fp);/*輸出換行符*/}fclose(fp);printf("程序復(fù)制鍵盤輸入字符結(jié)束。\n");}【例8.3】逐行復(fù)制從鍵盤輸入字符到指定文件,

直至輸入空行結(jié)束輸入文件名:d:\file1.txtFudanUniversity.Shanghai,China.程序復(fù)制鍵盤輸入字符結(jié)束。第30頁/共35頁32【例8.4】輸入一篇英文短文,統(tǒng)計(jì)文件中的行數(shù)、單詞數(shù)和字符數(shù)的程序。設(shè)全由英文字母組成的一段連續(xù)字符序列為一個(gè)英文單詞。程序?yàn)榻y(tǒng)計(jì)單詞數(shù),需要標(biāo)識(shí)一個(gè)單詞的開始和結(jié)束,程序引入一個(gè)狀態(tài)變量。如果程序遇到一個(gè)非英文字母字符,程序設(shè)置狀態(tài)不在單詞中;如果程序遇到一個(gè)英文字母字符,程序的原先狀態(tài)又不在單詞中,表示程序遇到一個(gè)新的單詞,程序?qū)卧~計(jì)數(shù)器增1,并置狀態(tài)在單詞中。8.4文件處理程序?qū)嵗忸}思路第31頁/共35頁33#include<stdio.h>#include<ctype.h>#defineINWORD1 /*正在單詞中*/#defi

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論