《新編C語言程序設(shè)計(jì)教程》課件第11章_第1頁
《新編C語言程序設(shè)計(jì)教程》課件第11章_第2頁
《新編C語言程序設(shè)計(jì)教程》課件第11章_第3頁
《新編C語言程序設(shè)計(jì)教程》課件第11章_第4頁
《新編C語言程序設(shè)計(jì)教程》課件第11章_第5頁
已閱讀5頁,還剩63頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第11章文件類型11.1文件類型與文件指針11.2文件的打開與關(guān)閉11.3文件的讀寫與建立11.4文件輔助操作11.5程序設(shè)計(jì)舉例11.1文件類型與文件指針1.文本文件和二進(jìn)制文件C語言文件把數(shù)據(jù)看作是一連串的字符(字節(jié))。C語言文件是一個(gè)字符(字節(jié))的序列,是一字符流或字節(jié)流,是一種流式文件。根據(jù)數(shù)據(jù)的組織形式,可分為文本文件和二進(jìn)制文件。

文本文件又稱為ASCII文件,每一個(gè)字節(jié)中存放一個(gè)ASCII代碼,代表一個(gè)字符。例如,一個(gè)整數(shù)123,若用ASCII文件存放,占3個(gè)字節(jié)的存儲(chǔ)單元,1、2、3各用一個(gè)字節(jié)存儲(chǔ)。而1、2、3的ASCII碼分別為49、50、51,故123用ASCII文件存放時(shí),存放形式為001100010011001000110011。二進(jìn)制文件是直接用數(shù)據(jù)的二進(jìn)制形式存放。例如,對(duì)整數(shù)123,二進(jìn)制為0000000001111011,用二進(jìn)制文件存放,需2個(gè)字節(jié),存放形式為0000000001111011。2.緩沖文件系統(tǒng)和非緩沖文件系統(tǒng)

在緩沖文件系統(tǒng)中,系統(tǒng)自動(dòng)在內(nèi)存中為每個(gè)正在使用的文件開辟一個(gè)緩沖區(qū),文件的存取都是通過緩沖區(qū)進(jìn)行的。緩沖區(qū)相當(dāng)于一個(gè)中轉(zhuǎn)站,它的大小由具體的C版本規(guī)定,一般為512字節(jié)。緩沖文件系統(tǒng)原來用于處理文本文件。在非緩沖文件系統(tǒng)中,系統(tǒng)不為所打開的文件自動(dòng)開辟緩沖區(qū),緩沖區(qū)的開辟由程序完成。非緩沖文件系統(tǒng)原來用于處理二進(jìn)制文件。

ANSIC不再采用非緩沖文件系統(tǒng),而只采用緩沖文件系統(tǒng),在處理二進(jìn)制文件時(shí),也通過緩沖文件系統(tǒng)進(jìn)行。ANSIC通過擴(kuò)充緩沖文件系統(tǒng),使緩沖文件系統(tǒng)既能處理文本文件,又能處理二進(jìn)制文件。

3.內(nèi)部文件和外部文件

存放在外部介質(zhì)上的文件稱為外部文件,通過文件名標(biāo)識(shí)。C程序中的文件稱為內(nèi)部文件,用文件指針來描述。程序中要實(shí)現(xiàn)對(duì)文件的處理,先必須在內(nèi)部文件與外部文件之間建立聯(lián)系,打開文件;然后方可對(duì)文件進(jìn)行操作。文件最基本的操作是讀寫操作;操作完成應(yīng)當(dāng)切斷內(nèi)部文件與外部文件之間的聯(lián)系,關(guān)閉文件。對(duì)文件進(jìn)行的所有操作通過C編譯系統(tǒng)提供的標(biāo)準(zhǔn)函數(shù)完成,這些函數(shù)的信息包含在頭文件“stdio.h”中。11.1.2文件類型

在緩沖文件系統(tǒng)中,系統(tǒng)為每個(gè)被使用的文件都在內(nèi)存中開辟一個(gè)區(qū)域,用來存放文件名、文件狀態(tài)、緩沖區(qū)狀態(tài)及文件當(dāng)前位置等信息,這些信息保存在一個(gè)結(jié)構(gòu)體變量中。文件類型是一個(gè)特殊的結(jié)構(gòu)體類型,一般命名為FILE。用戶可以直接使用FILE來定義文件類型變量,存放要處理的文件的基本信息。各種C編譯系統(tǒng)的FILE定義可以不同,但均包含進(jìn)行文件處理所需的基本信息。下面是TURBOC中對(duì)FILE的定義:typedefstruct{shortlevel;unsignedflags;charfd;unsignedcharhold;shortbsize;unsignedchar*buffer;unsignedchar*curp;unsignedistemp;shorttoken;}FILE;11.1.3文件指針變量

對(duì)文件的描述,往往通過指向文件的文件指針變量來進(jìn)行。文件指針變量定義的形式為:

FILE*文件指針變量;例如:FILE*fp,*fpa[10];定義了文件指針變量fp和文件指針變量數(shù)組fpa。文件指針變量fp及文件指針變量數(shù)組fpa的每個(gè)分量可以指向一個(gè)文件的信息。11.2文件的打開與關(guān)閉11.2.1文件的打開

文件的打開用fopen()函數(shù)完成,調(diào)用方式通常為:

fp=fopen(文件名,文件使用方式);

文件使用方式共有12種,用特定字符形成的字符串來描述。

(1)″r″方式,以只讀方式打開文本文件。這時(shí)從文件中讀數(shù)據(jù)到內(nèi)存,故要求文件已經(jīng)存在。用″r″方式打開的文件只能讀,不能同時(shí)寫。

(2)″w″方式,以只寫方式打開文本文件。這時(shí)將內(nèi)存中的數(shù)據(jù)寫入到磁盤文件中。若文件不存在,建立新文件;若文件存在,則刷新文件,重新建立。用″w″方式打開的文件只能寫,不能同時(shí)讀。(3)″a″方式,為文本文件的追加方式。用于向已存在的文件尾部追加新的數(shù)據(jù),而文件中原來的數(shù)據(jù)不被破壞。

(4)″r+″、″w+″、″a+″方式,打開的文本文件既能讀又能同時(shí)寫。

″r+″方式:在讀的同時(shí)可以進(jìn)行寫。讀寫位置指針在頭部,若原來存在此文件,則以覆蓋方式寫。

″w+″方式:在寫的同時(shí)可以進(jìn)行讀。由于打開文件時(shí),文件原來的內(nèi)容被刷新,一般不要在打開文件后立即讀文件。

″a+″:在追加的同時(shí)可以進(jìn)行讀。讀文件時(shí),從文件首部開始;寫文件時(shí),在文件尾部追加。(5)″rb″、″wb″、″ab″、″rb+″、″wb+″、″ab+″是使用二進(jìn)制文件相應(yīng)的六種方式。打開文件可得到三個(gè)信息:①要訪問的文件名。②使用文件的方式。③哪一個(gè)指針變量用于指向被打開的文件。打開成功,返回文件指針(文件信息區(qū)的起始地址);不能打開,返回空指針。

例如:

(1)fp=fopen(″student.dat″,″w″);以只寫方式打開當(dāng)前盤當(dāng)前目錄下的文本文件中的學(xué)生數(shù)據(jù)文件,用戶可將數(shù)據(jù)寫入此磁盤文件中。

(2)fp=fopen(″c:\cj\cjc.dat″,student.dat″,″r″);以只讀方式打開C盤成績(jī)子目錄下C語言成績(jī)文件,用戶可將文件中數(shù)據(jù)讀出來。但此文件必須存在,否則會(huì)出錯(cuò)。(3)fp=fopen(″PRG″,″ab+″);打開二進(jìn)制文件PRG,在讀的同時(shí)也可以寫。為確保文件的讀寫操作,對(duì)文件是否已正常打開往往加上if語句進(jìn)行控制。例如:

if(fp=fopen((″student.dat″,″w″)==NULL) {printf(″不能打開文件!″);

exit(0);

}

說明:

(1)不是所有編譯系統(tǒng)均提供以上12種文件使用方式。

(2)用″r″、″rb″方式打開的文件必須已經(jīng)存在。

(3)用″w″、″wb″方式打開的文件,可以存在也可以不存在。不存在時(shí),則新建文件;存在時(shí),重新建立,原文件內(nèi)容不被保留。

(4)在讀寫文本文件時(shí),對(duì)回車換行符要進(jìn)行轉(zhuǎn)換,讀時(shí)回車換行符轉(zhuǎn)換成換行符,寫時(shí)回車換行符轉(zhuǎn)換成回車、換行兩個(gè)字符。對(duì)二進(jìn)制文件,不進(jìn)行這種轉(zhuǎn)換。(5)程序運(yùn)行時(shí),系統(tǒng)自動(dòng)打開標(biāo)準(zhǔn)輸入stdin、標(biāo)準(zhǔn)輸出stdout、標(biāo)準(zhǔn)出錯(cuò)輸出stderr三個(gè)標(biāo)準(zhǔn)文件。stdin、stdout、stderr由系統(tǒng)自動(dòng)定義,可直接使用。

(6)標(biāo)準(zhǔn)設(shè)備文件可與普通文件一樣操作,但將產(chǎn)生特殊效果。如寫到打印機(jī),將在程序中實(shí)現(xiàn)打印輸出控制。11.2.2文件的關(guān)閉

文件在使用完后,應(yīng)及時(shí)關(guān)閉。文件的關(guān)閉用fclose()函數(shù)完成,調(diào)用方式為:

fclose(文件指針變量);關(guān)閉文件將使文件指針變量與文件名脫鉤,即指針變量不再指向該文件。文件關(guān)閉后不能再用該指針變量對(duì)文件進(jìn)行操作,該指針變量可再指向其它文件。順利執(zhí)行了關(guān)閉操作,將返回函數(shù)值0。如返回一個(gè)非0值,則表示文件關(guān)閉出錯(cuò)。11.3文件的讀寫與建立11.3.1字符級(jí)數(shù)據(jù)的讀和寫1.字符級(jí)數(shù)據(jù)的讀

函數(shù)原型:

intfgetc(FILE*fp);功能:從文件指針fp所指向的文件中讀取一個(gè)字節(jié)的代碼值(字符),作為函數(shù)的返回值。正常情況下為一個(gè)字符,讀到文件尾或出錯(cuò)時(shí)為EOF(-1)。

說明:

(1)讀完一字節(jié)數(shù)據(jù)后,文件指針自動(dòng)后移。

(2)getc和fgetc是等價(jià)的宏。

(3)若文件指針為stdin,則fgetc(stdin)功能與getchar()等價(jià)。2.字符級(jí)數(shù)據(jù)的寫

函數(shù)原型:

intfputc(intch,F(xiàn)ILE*fp);功能:將ch寫入文件指針fp所指向的文件中。寫入成功返回字符值,不成功返回值EOF。說明:

(1)寫入數(shù)據(jù)前,文件指針自動(dòng)后移。

(2)puttc和fputc是等價(jià)的宏。

(3)若文件指針為stdout,則fputc(stdout)功能與puttchar()等價(jià)。

(4)文件的建立通過寫操作完成。11.3.2字級(jí)數(shù)據(jù)的讀和寫1.字級(jí)數(shù)據(jù)的讀

函數(shù)原型:

intgetw(FILE*fp);功能:從文件指針fp所指文件中讀一個(gè)字的數(shù)據(jù)(整數(shù)),并以它作為函數(shù)的返回值。說明:非標(biāo)準(zhǔn)C所提供函數(shù)。2.字節(jié)數(shù)據(jù)的寫

函數(shù)原型:

intputw(intw,F(xiàn)ILE*fp);功能:寫一個(gè)字的數(shù)據(jù)(整數(shù))到文件指針fp所指的文件中,并以它作為函數(shù)的返回值。說明:非標(biāo)準(zhǔn)C所提供函數(shù)。11.3.3字符串級(jí)數(shù)據(jù)的讀和寫1.字符串?dāng)?shù)據(jù)的讀

函數(shù)原型:

char*fgets(char*str,intlen,F(xiàn)ILE*fp);

功能:

從文件指針fp所指的文件中讀入一個(gè)長(zhǎng)度為len-1的字符串,送入到str所指內(nèi)存地址中。返回值為str的首地址,若讀到文件尾或出錯(cuò),則返回值為NULL。

說明:

(1)字符串讀入后在最后加結(jié)尾符′\0′。

(2)將讀到的回車符作為字符存儲(chǔ)。這點(diǎn)與gets()函數(shù)不同,gets()把讀到的回車符轉(zhuǎn)換成結(jié)尾符。

(3)字符串?dāng)?shù)據(jù)的讀和寫亦稱“行處理”。2.字符串?dāng)?shù)據(jù)的寫函數(shù)原型:

intfputs(char*str,FILE*fp);功能:將str指針?biāo)缸址畬懭氲轿募羔榝p所指文件中。若該函數(shù)成功調(diào)用,返回函數(shù)值0,否則返回函數(shù)值非0。11.3.4數(shù)據(jù)塊數(shù)據(jù)的讀和寫1.數(shù)據(jù)塊數(shù)據(jù)的讀函數(shù)原型:

unsignedfread(void*buffer,unsignedsize,unsignedcount,F(xiàn)ILE*fp);功能:從文件指針fp所指的文件中讀取count個(gè)大小為size字節(jié)的數(shù)據(jù)塊到buffer指針?biāo)傅膬?nèi)存中。讀到的數(shù)據(jù)可能含有各種不同的類型。若該函數(shù)成功調(diào)用,返回count的值。

例如:

inta[100];

fread(a,2,100,fp);/*從fp讀取100個(gè)大小為2字節(jié)的數(shù)據(jù)塊(整數(shù))到數(shù)組a中*/2.數(shù)據(jù)塊數(shù)據(jù)的寫

函數(shù)原型:

unsignedfwrite(void*buffer,unsignedsize,unsignedcount,F(xiàn)ILE*fp);

功能:向文件指針fp所指的文件寫入由buffer指針?biāo)鶚?biāo)識(shí)的count個(gè)大小為size字節(jié)的數(shù)據(jù)塊。若該函數(shù)成功調(diào)用,返回count的值。例如:

inta[100];

……

fwrite(a,2,100,fp);/*將整個(gè)數(shù)組a寫入文件fp中*/11.3.5格式化數(shù)據(jù)的讀和寫1.格式化讀函數(shù)原型:

intfscanf(FILE*fp,格式字串,地址表);功能:按指定格式從文件fp中讀取數(shù)據(jù)至指定地址。例如:

inti,j;

floatf;

fscanf(fp,"%d%d%f",?&i,&j,&f);/*從fp中按指定格式讀取數(shù)據(jù)至i、j、f中*/2.格式化寫函數(shù)原型:

intfprintf(FILE*fp,格式字串,變量表);功能:按指定格式將給定數(shù)據(jù)寫入文件fp中。使用fscanf(?)和fprintf(?)函數(shù)對(duì)磁盤文件進(jìn)行讀和寫相當(dāng)方便,但是輸入時(shí)需將ASCII碼轉(zhuǎn)換為二進(jìn)制,輸出時(shí)需將二進(jìn)制轉(zhuǎn)換成ASCII碼,費(fèi)時(shí)間,故一般較少采用,而是使用fread(?)和fwrite(?)函數(shù)。11.3.6文件的建立步驟對(duì)文件操作前必須打開文件,文件打開后才可進(jìn)行讀寫操作,操作完成應(yīng)關(guān)閉文件。文件的建立步驟如下:

(1)以寫方式打開文件。

(2)將數(shù)據(jù)寫入文件,多個(gè)數(shù)據(jù)反復(fù)寫入。

(3)寫完數(shù)據(jù)關(guān)閉文件。例11-1

定義一個(gè)函數(shù),建立存放26個(gè)英文小寫字母的文件LF.DAT。voidcreatfile(){charl;

FILE*fp;

if((fp=fopen(″LF.DAT″,″w″))==NULL)/*打開文件*/{printf(″不能打開文件!″);

exit(0);

}for(l=′a′;l<=′z′;l++)/*寫入數(shù)據(jù)*/fputc(l,fp);

fclose(fp);/*關(guān)閉文件*/}

例11-2

定義一個(gè)函數(shù),建立存放某班50個(gè)同學(xué)姓名、C語言成績(jī)的數(shù)據(jù)文件CCJ.DAT,原始數(shù)據(jù)由數(shù)組參數(shù)傳入。voidcreatfile(floatx[]){inti;

FILE*fp;

if((fp=fopen(″CCJ.DAT″,″wb″))==NULL)/*打開文件*/{printf(″不能打開文件!″);

exit(0);

}for(i=0;i<=50;i++)/*寫入數(shù)據(jù)*/fwrite(x+i,4,1,fp);

fclose(fp);/*關(guān)閉文件*/}

寫入數(shù)據(jù)也可以整體一次完成:

fwrite(x,4,50,fp);

(1)文件的建立在操作系統(tǒng)下可通過改向操作完成。

(2)數(shù)據(jù)源文件也可通過任何字處理軟件建立。

(3)執(zhí)行一個(gè)向打印機(jī)寫的操作,可在程序中實(shí)現(xiàn)數(shù)據(jù)的打印輸出。例如:

fp=fopen(″PRN:″,″w″);

fputs(″HUNANCOMPUTER″,fp);/*打印輸出HUNANCOMPUTER*/打印輸出也可直接使用系統(tǒng)提供的打印機(jī)文件指針stdprn。11.3.7文件的讀取控制

是不是處于文件尾部,可用文件結(jié)尾標(biāo)志EOF來判斷,還可用feof(?)函數(shù)來判斷,即

(1)?while(fgetc(fp)!=EOF) {讀取數(shù)據(jù)}(2)?while(!feof(fp)){讀取數(shù)據(jù)}

對(duì)于二進(jìn)制文件,由于最后一個(gè)數(shù)據(jù)可能為?1(EOF),因此最好用feof(?)函數(shù)控制讀取。當(dāng)然,讀文件前應(yīng)先打開文件,讀完數(shù)據(jù)后應(yīng)該關(guān)閉文件。

例11-3

從上例建立的文件CCJ.DAT中讀出學(xué)生的C語言成績(jī),求出每個(gè)學(xué)生與平均成績(jī)之差。/*程序11-3,求每個(gè)學(xué)生與平均成績(jī)之差*/structst{char*name;

floatcj;}C[200];/*假定學(xué)生人數(shù)不超過200人*/main(){inti=0,n;

floatsum=0,av;

floatsav[200];/*與平均成績(jī)之差*/FILE*fp;FILE*fp;if((fp=fopen("CCJ.DAT","rb"))==NULL)/*打開文件*/{printf("不能打開文件!");

exit(0);}while(!feof(fp))/*讀數(shù)據(jù),同時(shí)進(jìn)行累加*/{fread(c+i,6,1,fp);

sum+=c[i].cj;

i++;

}n=i;av=sum/n;/*求平均成績(jī)*/for(i=0;i<n;i++)/*求與平均成績(jī)之差并輸出*/{sav[i]=c[i].cj?av;

printf("%s,%6.1f,%6.1f\n",c[i].name,c[i].cj,sav[i]);

}11.4文件輔助操作1.反繞函數(shù)函數(shù)原型:

voidrewind(FILE*fp);功能:使文件的讀寫位置指針返回文件開頭。2.隨機(jī)定位函數(shù)

函數(shù)原型:

intfseek(FILE*fp,longintnumbytes,intorigin);

功能:將文件的位置指針移動(dòng)numbytes個(gè)字節(jié),numbytes為正數(shù)表示后移,為負(fù)數(shù)表示前移。其中移動(dòng)的開始位置由origin確定,origin的值可以為0、1、2,或SEEK-SET、SEEK-CUR、SEEK-END,分別代表“文件開頭”、“當(dāng)前位置”、“文件末尾”三個(gè)特殊位置。

例如:

(1)fseek(fp,100l,0);/*將文件的位置指針移動(dòng)到離文件開頭100個(gè)字節(jié)處*/(2)fseek(fp,50l,1);/*將文件的位置指針向前移動(dòng)50個(gè)字節(jié)處*/(3)fseek(fp,-10l,2);/*將文件的位置指針向后移10個(gè)字節(jié)處*/利用隨機(jī)定位函數(shù)實(shí)現(xiàn)對(duì)文件的隨機(jī)讀寫。3.求當(dāng)前讀寫位置函數(shù)函數(shù)原型:

longintftell(FILE*fp);功能:得到文件的當(dāng)前讀寫位置指針,用相對(duì)于文件開頭的位移量來表示。若出現(xiàn)調(diào)用錯(cuò)誤,返回值為-1。4.出錯(cuò)檢測(cè)函數(shù)

函數(shù)原型:

intferror(FILE*fp);功能:檢查文件中各種輸入輸出函數(shù)調(diào)用是否出錯(cuò)。若得到的函數(shù)值為0,表示未出錯(cuò);得到的函數(shù)值非0,表示出錯(cuò)。調(diào)用fopen()函數(shù)時(shí),ferror初值自動(dòng)置0。5.初始化清零函數(shù)函數(shù)原型:

voidclearerr(FILE*fp);功能:清除文件錯(cuò)誤標(biāo)志和文件結(jié)束,將文件錯(cuò)誤標(biāo)志和文件結(jié)束標(biāo)志置0。輸入輸出函數(shù)調(diào)用出錯(cuò)后,出錯(cuò)標(biāo)志一直保留,直到對(duì)同一文件調(diào)用clearerr()函數(shù)、rewind()函數(shù)或任一輸入輸出函數(shù)。11.5程序設(shè)計(jì)舉例

例11-4

從鍵盤輸入若干字符,存入某磁盤文件中,然后從文件中讀取數(shù)據(jù)打印輸出。/*程序11-4,輸入若干字符至文件,并打印輸出*/main(){charch,*fname;

FILE*fp,*pp;

scanf(″%s″,fname);/*輸入磁盤文件名*//*建立文件*/if((fp=fopen(fname,″w″))==NULL)

{printf(″文件不能打開!″);exit(0);

}ch=getchar(?);/*從鍵盤讀數(shù)據(jù)并寫入文件fp*/while(ch!='\n'){fputc(ch,fp);

ch=getchar(?);

}fclose(fp);/*從剛建立的磁盤文件中讀取數(shù)據(jù),并打印輸出*/if((fp=fopen(fname,"r"))==NULL)/*打開數(shù)據(jù)文件*/{?printf("數(shù)據(jù)文件不能打開!");

exit(0);

}if((pp=fopen(″PRN:″,″w″))==NULL)

{printf(″打印機(jī)沒能連接!″);

exit(0);

}ch=fgetc(fp);

while(!feof(fp))

{fprintf(pp,″%6c″,ch);

ch=fgetc(fp);

}fclose(fp);

fclose(pp);}

例11-5

學(xué)生信息包含有學(xué)號(hào)、姓名、年齡、成績(jī)及住址,從鍵盤輸入n個(gè)學(xué)生的這些信息,然后存入一個(gè)磁盤文件STUDENT.DAT中。算法提示:

(1)學(xué)生信息含有不同類型的數(shù)據(jù),故用結(jié)構(gòu)體數(shù)組描述。

(2)為方便使用,文件的建立用函數(shù)完成,學(xué)生信息寫入文件時(shí)用fwrite()函數(shù)進(jìn)行。程序如下:/*程序11-5,建立學(xué)生信息文件*/#defineSIZE200structstudent{intnum;

char*name;

intage;

floatscore;

char*addr;}stud[SIZE];/*學(xué)生數(shù)組*/intn;/*學(xué)生人數(shù)*/voidsave()/*建立文件STUDENT.DAT*/{FILE*fp;

inti;

if((fp=fopen(″STUDENT.DAT″,″wb″))==NULL)

{printf(″不能建立文件!″);

exit(0);

}for(i=0;i<n;i++)

if(fwrite(&stud[i],sizeof(structstudent),1,fp)!=1)

{printf(″文件不能寫!\n″);

exit(0);

}fclose(fp);

}main(){inti;

scanf(″%d″,&n);

for(i=0;i<n;i++)/*從鍵盤輸入數(shù)據(jù)*/scanf(″%d%s%d%f%s″,&stud[i].mum,stud[i].name,&stud[i].age,&stud[i].score,stud[i].addr);

save();/*調(diào)用函數(shù)建立文件*/}

例11-6

文件auto.dat存放了某道路同一時(shí)間各路段的車流信息,內(nèi)容如下表。從文件中讀取數(shù)據(jù),計(jì)算各路段的車流量。車型路段1路段2路段3路段4BUS1001208098JEEP50997090TRUCK76234200190CAR234400365380MOTO800650700740/*例11-6,分段車流量計(jì)算*/main(?){?structat{char*name;

intnum[4];

}auto[5];/*原始數(shù)據(jù)*/FILE*fp;

inti,j;

intvehicle[4];/*輸出數(shù)組*/if((fp=fopen("auto.dat","rb"))==NULL)/*打開文件*/{printf("不能打開文件!");

exit(0);}i=0;while(!?feof(fp))/*讀數(shù)據(jù)*/{fread(auto+i,10,1,fp);

i++;

}for(i=0;i<4;i++)/*計(jì)算車分段流量*/{vehicle[4]=0;

for(j=0;j<5;j++)vehicle[i]+=auto[j].num[i];

}printf("路段1路段2路段3路段4\n");for(i=0;i<4;i++)/*輸出*/printf("%8d",vehicle[i]);}運(yùn)行結(jié)果: 路段1路段2路段3路段41260150314151538

例11-7

編寫類似DOS的拷貝命令的文件復(fù)制程序。算法提示:

(1)進(jìn)行文件復(fù)制時(shí)需給出源文件與目標(biāo)文件,程序中利用主函數(shù)的參數(shù)通過命令行獲得。

(2)進(jìn)行文件復(fù)制時(shí)反復(fù)從源文件中讀,向目標(biāo)文件寫。程序如下:/*程序11-7,文件復(fù)制程序*/main(intargc,char*argv[]){inti;

FILE*fps,*fpt;

if(argc!=3){puts("命令行參數(shù)格式是:執(zhí)行文件名源文件名目標(biāo)文件名");exit(0);}if((fps=fopen(argv[1],"rb"))==NULL){printf("源文件不能打開!");

exit(0);

}if((fpt=fopen(argv[2],"wb"))==NULL){printf("目標(biāo)文件不能建立!");

exit(0);

}while(!feof(fps)){fread(&i,2,1,fps);fwrite(&i,2,1,fpt);

}fclsoe(fps);fclose(fpt);}

例11-8

將例11-5建立的磁盤文件STUDENT.DAT首先在屏幕上輸出文件內(nèi)容,然后使指針移到開頭,實(shí)現(xiàn)文件的復(fù)制。本題對(duì)文件的操作有顯示輸出和復(fù)制兩種,但不是同時(shí)進(jìn)行,故會(huì)涉及到指針移動(dòng),可用rewind(?)函數(shù)將源文件指針移回文件開頭。程序如下:/*程序11-8,文件的輸出復(fù)制操作*/#defineSIZE200structstudent{intnum;

char*name;

intage;

floatscore;

char*addr;

}stud;main(?){FILE*fp1,*fp2;

char*tname;inti=0;if((fp1=fopen("STUDENT.DAT","rb"))==NULL){printf("不能打開文件!");

exit(0);

}while(!feof(fp1))/*屏幕輸出*/{fread(&stud,sizeof(structstudent),1,fp1);printf("%6d%16s%8d%8.1f%28s\n",stud.mum,,stud.age,stud.score,stud.addr);}puts("請(qǐng)輸入目標(biāo)文件名");gets(tname);

rewind(fp1);if((fp2=fopen(tname,"wb"))==NULL){printf("不能建立文件!");

exit(0);

}while(!feof(fp1))/*復(fù)制文件*/{fread(&stud,sizeof(structstudent),1,fp1);

fwrite(&stud,sizeof(structstudent),1,fp2);

}fclose(fp1);

fclose(fp2);}

例11-9

某書店庫存數(shù)據(jù)保存在庫存文件BK中,每天的銷售數(shù)據(jù)保存在銷售文件BX中。編寫程序,根據(jù)當(dāng)天的銷售數(shù)據(jù)調(diào)整庫存文件。算法提示:

(1)用一臨時(shí)文件BT先保存調(diào)整后的庫存。

(2)從庫存文件BK中讀出庫存數(shù)據(jù)減去從銷售文件BX中讀出的對(duì)應(yīng)銷售數(shù)據(jù)進(jìn)行庫存調(diào)整,寫入臨時(shí)庫存文件BT。

(3)操作完畢,將臨時(shí)庫存文件BT改名為原庫存文件BK。程序如下:

/*程序11-9,文件合并操作*/ structbook {char*name;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論