版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《血液凈化質(zhì)量控制》課件
- 工會(huì)續(xù)簽合同的領(lǐng)導(dǎo)評語
- 《外部形態(tài)頭部》課件2
- 2025年甘肅道路客貨運(yùn)輸從業(yè)資格證b2考試題庫
- 2025年銀川貨運(yùn)從業(yè)資格證題目答案
- 《外出安全知識(shí)》課件
- 《食品安全風(fēng)險(xiǎn)監(jiān)測》課件
- 鐵路運(yùn)輸勞動(dòng)防護(hù)用品管理要求
- 酒店式公寓外墻修繕合同
- 保險(xiǎn)公司業(yè)務(wù)員聘用合同樣本
- 水果削皮機(jī)的工業(yè)工程設(shè)計(jì)論文
- 空壓站設(shè)備安裝施工組織設(shè)計(jì)方案(空壓站設(shè)備安裝)
- 屋面彩鋼板檁條安裝施工方案
- 肝癌患者的護(hù)理疑難病例討論記錄文本
- 四大經(jīng)典之溫病
- 石化裝置動(dòng)設(shè)備操作規(guī)程
- 海花島(海南儋州)民宿眾籌計(jì)劃書
- 注塑件通用技術(shù)條件
- 人大代表選舉主持詞_1
- KingSCADA初級教程工程安全和用戶管理
- 消防安裝工程質(zhì)量通病及防治措施
評論
0/150
提交評論