第8章 數(shù)據(jù)文件處理技術(shù)_第1頁
第8章 數(shù)據(jù)文件處理技術(shù)_第2頁
第8章 數(shù)據(jù)文件處理技術(shù)_第3頁
第8章 數(shù)據(jù)文件處理技術(shù)_第4頁
第8章 數(shù)據(jù)文件處理技術(shù)_第5頁
已閱讀5頁,還剩78頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第8章數(shù)據(jù)文件處理技術(shù)《程序設(shè)計(jì)》18.1C文件概述8.2文件類型和文件類型指針變量8.3文件打開和關(guān)閉庫函數(shù)文件處理程序結(jié)構(gòu)和常用文件庫函數(shù)文件程序設(shè)計(jì)實(shí)例《程序設(shè)計(jì)》2目錄8.1C文件概述(1)程序文件包括源程序文件(后綴為.c)、目標(biāo)文件(后綴為.obj)、可執(zhí)行文件(后綴為.exe)等。文件的內(nèi)容是程序代碼。(2)數(shù)據(jù)文件文件的內(nèi)容供程序運(yùn)行時(shí)讀寫的數(shù)據(jù),如在程序運(yùn)行過程中輸出到磁盤(或其他外部設(shè)備)的數(shù)據(jù),或在程序運(yùn)行過程中供讀入的數(shù)據(jù)。如一批學(xué)生的成績數(shù)據(jù)、貨物交易的數(shù)據(jù)等?!冻绦蛟O(shè)計(jì)》38.1C文件概述文件(file)存儲在外部介質(zhì)上數(shù)據(jù)的集合。操作系統(tǒng)是以文件為單位對數(shù)據(jù)進(jìn)行管理。輸入輸出是數(shù)據(jù)傳送的過程,數(shù)據(jù)如流水一樣從一處流向另一處,因此常將輸入輸出形象地稱為流(stream),即數(shù)據(jù)流。流表示了信息從源到目的端的流動。在輸入操作時(shí),數(shù)據(jù)從文件流向計(jì)算機(jī)內(nèi)存在輸出操作時(shí),數(shù)據(jù)從計(jì)算機(jī)流向文件(如打印機(jī)、磁盤文件)。《程序設(shè)計(jì)》48.1C文件概述C語言把文件看作一個(gè)字符(或字節(jié))的序列,即由一個(gè)一個(gè)字符(或字節(jié))的數(shù)據(jù)順序組成。一個(gè)輸入輸出流就是一個(gè)字符流或字節(jié)(內(nèi)容為二進(jìn)制數(shù)據(jù))流。C的數(shù)據(jù)文件由一連串的字符(或字節(jié))組成,而不考慮行的界限,兩行數(shù)據(jù)間不會自動加分隔符,對文件的存取是以字符(字節(jié))為單位的。輸入輸出數(shù)據(jù)流的開始和結(jié)束僅受程序控制而不受物理符號(如回車換行符)控制,這就增加了處理的靈活性。這種文件稱為流式文件?!冻绦蛟O(shè)計(jì)》58.1C文件概述一個(gè)文件要有一個(gè)唯一的文件標(biāo)識,以便用戶識別和引用。文件標(biāo)識包括3部分:(1)文件路徑;(2)文件名主干;(3)文件后綴。文件路徑表示文件在外部存儲設(shè)備中的位置。文件名主干的命名規(guī)則遵循標(biāo)識符的命名規(guī)則。文件后綴用來表示文件的性質(zhì)?!冻绦蛟O(shè)計(jì)》68.1C文件概述在C語言中,文件中的數(shù)據(jù)流的組織形式有兩種:數(shù)據(jù)流由一個(gè)個(gè)字符組成,稱為正文(text)文件(或者文本文件)數(shù)據(jù)流由二進(jìn)制字節(jié)代碼組成,稱為二進(jìn)制(binary)文件《程序設(shè)計(jì)》7C文件概述正文文件(或者文本文件)文件中數(shù)據(jù)是字符,每個(gè)字符以ASCII代碼存儲,占一個(gè)字節(jié)存儲數(shù)值數(shù)據(jù)要占較多的存儲空間,輸入輸出時(shí)因內(nèi)存和外存的存儲形式不一致,還要進(jìn)行內(nèi)外表示形式之間的轉(zhuǎn)換正文文件數(shù)據(jù)流是字符,能讓程序?qū)ξ募髦饌€(gè)字符處理和文件中的數(shù)據(jù)能供人閱讀。二進(jìn)制文件文件中的數(shù)據(jù)按其在內(nèi)存中的存儲形式存儲在文件中。存儲數(shù)值數(shù)據(jù)只占其內(nèi)部表示所需的字節(jié)數(shù)用二進(jìn)制形式存儲數(shù)值數(shù)據(jù)可以節(jié)省外存空間,并免去數(shù)據(jù)內(nèi)外表示形式之間的轉(zhuǎn)換用于程序與程序或程序與設(shè)備之間傳遞成批數(shù)據(jù)信息《程序設(shè)計(jì)》8C文件概述程序與文件交換數(shù)據(jù)的實(shí)現(xiàn)過程設(shè)備的讀寫操作是在操作系統(tǒng)的管理和控制下進(jìn)行操作系統(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ì)》9C文件概述程序要讀取文件中的數(shù)據(jù),首先打開要讀的文件,然后才能從該文件讀取數(shù)據(jù),并在使用結(jié)束時(shí),及時(shí)關(guān)閉文件程序要向文件寫入數(shù)據(jù),也是先打開文件(可能包括建立一個(gè)新文件),然后向文件輸出數(shù)據(jù),最后關(guān)閉文件C語言本身未提供有關(guān)文件操作的輸入輸出語句,對文件的打開關(guān)閉和讀寫操作都用系統(tǒng)提供的庫函數(shù)來實(shí)現(xiàn)《程序設(shè)計(jì)》108.2文件類型、文件的打開和關(guān)閉

文件類型FILE操作系統(tǒng)除為文件開辟緩沖區(qū)外,還為每個(gè)被使用的文件在內(nèi)存中開辟另一個(gè)存儲區(qū),用于存放有關(guān)對文件進(jìn)行操作所需的控制信息,如:文件名、文件讀寫狀態(tài)、文件緩沖區(qū)大小和位置、當(dāng)前讀寫位置等C系統(tǒng)將這些信息存儲在一個(gè)結(jié)構(gòu)變量中,這種結(jié)構(gòu)的類型由系統(tǒng)預(yù)定義,取名FILE,習(xí)慣稱文件類型不同系統(tǒng)的文件類型所含內(nèi)容也不全相同,可查閱所使用的C系統(tǒng)的stdio.h文件,在該文件中有FILE的定義《程序設(shè)計(jì)》11對文件讀寫之前應(yīng)該“打開”該文件,在使用結(jié)束之后應(yīng)“關(guān)閉”該文件。打開為文件建立相應(yīng)的信息區(qū)(用來存放有關(guān)文件的信息)和文件緩沖區(qū)(用來暫時(shí)存放輸入輸出的數(shù)據(jù))。在打開文件的同時(shí),指定一個(gè)指針變量指向該文件,建立起指針變量與文件之間的聯(lián)系,這樣,就可以通過該指針變量對文件進(jìn)行讀寫了。關(guān)閉撤銷文件信息區(qū)和文件緩沖區(qū),使文件指針變量不再指向該文件,顯然就無法進(jìn)行對文件的讀寫了?!冻绦蛟O(shè)計(jì)》12文件打開和關(guān)閉文件打開庫函數(shù)fopen()FILE*fp; //定義一個(gè)指向文件的指針變量fpfp=fopen(″a1″,″r″); //將fopen函數(shù)的返回值賦給指針變量fp文件關(guān)閉庫函數(shù)fclose()fclose(fp);《程序設(shè)計(jì)》13文件打開和關(guān)閉庫函數(shù)文件打開庫函數(shù)fopen()讀寫文件之前先打開文件,使用庫函數(shù)fopen()調(diào)用函數(shù)fopen()的一般形式為:

fopen(文件名,使用方式)文件名(可能還包括目錄路徑)為字符串表達(dá)式。使用方式也是一個(gè)字符串,用來指明文件的讀寫方式(見表8-1)函數(shù)fopen()將返回一個(gè)存放文件控制信息結(jié)構(gòu)的指針,該文件的有關(guān)控制信息就將存放在該結(jié)構(gòu)中,供以后讀寫文件操作之用程序應(yīng)將調(diào)用函數(shù)fopen()返回的指針值賦給某個(gè)文件指針變量中保存語句fp=fopen(“\\usr4\\smp.dat”,“r”)

以讀方式打開根目錄下的usr4子目錄中的smp.dat文件《程序設(shè)計(jì)》14文件打開庫函數(shù)fopen()調(diào)用函數(shù)fopen()時(shí),可能不能打開指定的文件讀方式下打開不存在的文件寫方式下,外部存貯介質(zhì)已無剩余的自由空間外設(shè)故障或超過系統(tǒng)能同時(shí)打開的文件數(shù)文件不能打開時(shí),函數(shù)fopen()將返回一個(gè)空指針值NULL。考慮到文件不能正常打開情況,常用C代碼描述打開文件如

if((fp=fopen(filename,"r"))==NULL){

printf(“Cannotopen%sfile.\n”,filename);return;}以上代碼以讀方式打開一個(gè)文件,其中filename是表示文件名的字符數(shù)組或者指針。在調(diào)用函數(shù)fopen()后立即檢查打開是否成功,如果打開不成功,就輸出該文件不能打開后返回《程序設(shè)計(jì)》15文件打開庫函數(shù)fopen()《程序設(shè)計(jì)》16文件使用方式

意義

"r" 只讀,為讀打開正文文件

"w" 只寫,為寫打開正文文件

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

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

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

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

"r+" 讀寫,為讀/寫打開正文文件

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

"a+" 讀寫,為讀/寫打開正文文件

“rb+”或“r+b”

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

“wb+”或“w+b”

讀寫,為讀/寫建立并打開新的二進(jìn)制文件

"ab+"或"a+b" 讀寫,為讀/寫打開二進(jìn)制文件 表8-1fopen()的使用方式參數(shù)說明“r”方式打開的文件只能用于從文件讀入數(shù)據(jù),且要求文件存在“w”方式打開的文件只能用于向文件寫出數(shù)據(jù)。如打開時(shí),文件不存在,則新建一個(gè)以指定名字命名的文件;如原文件已存在,則原文件上的數(shù)據(jù)被全部刪除打開文件用于寫,不刪除原文件中的數(shù)據(jù),從原文件的末尾開始添加新數(shù)據(jù),用"a"方式用“r+”、“w+”、“a+”方式,可以輸入和輸出。用“r+”方式打開已存在的文件;用“w+”方式可新建一個(gè)文件;用“a+”方式打開一個(gè)已存在的文件,位置指針先移到文件的末尾,準(zhǔn)備添加數(shù)據(jù),也可以輸入數(shù)據(jù)要打開二進(jìn)制文件,只要在對應(yīng)正文件文件打開方式中接上字符b即可,如”rb”表示以輸入方式打開二進(jìn)制文件《程序設(shè)計(jì)》17標(biāo)準(zhǔn)文件正文文件與二進(jìn)制文件在使用時(shí),有一點(diǎn)不同對于正文文件,輸入時(shí),回車符和換行符合成為一個(gè)換行符輸入;輸出時(shí),換行符(\n)轉(zhuǎn)換成為回車符和換行符兩個(gè)字符一起輸出對于二進(jìn)制文件,不進(jìn)行上述這種轉(zhuǎn)換,二進(jìn)制文件中的數(shù)據(jù)形式與在內(nèi)存中的數(shù)據(jù)形式是完全一致的系統(tǒng)將常規(guī)設(shè)備上的輸入輸出數(shù)據(jù)流稱為標(biāo)準(zhǔn)文件,程序運(yùn)行時(shí),系統(tǒng)自動打開這些標(biāo)準(zhǔn)文件。它們是標(biāo)準(zhǔn)輸入文件stdin

、標(biāo)準(zhǔn)輸出文件stdout

、標(biāo)準(zhǔn)出錯輸出文件stderr和標(biāo)準(zhǔn)打印輸出文件stdprn程序除能直接使用前面各章都使用的不帶文件指針的標(biāo)準(zhǔn)輸入輸出庫函數(shù)外,也可對它們使用后面介紹的帶文件指針的一般形式的輸入輸出庫函數(shù)stdin指從終端輸入數(shù)據(jù);stdout是向終端輸出數(shù)據(jù)《程序設(shè)計(jì)》18文件關(guān)閉庫函數(shù)fclose()在使用完一個(gè)文件后,程序應(yīng)該立即關(guān)閉它。關(guān)閉文件可調(diào)用庫函數(shù)fclose()

來實(shí)現(xiàn)調(diào)用函數(shù)fclose()的一般形式為

fclose(文件指針);如fclose(fp);調(diào)用函數(shù)fclose()的作用是使文件指針變量終止原先調(diào)用函數(shù)fopen()時(shí)所建立的它與文件的聯(lián)系調(diào)用函數(shù)fclose()之后,不能再通過該文件指針變量對其原先相連的文件進(jìn)行讀寫操作,除非被再次打開文件被關(guān)閉后,原文件指針變量又可用來打開文件,或與別的文件相聯(lián)系,或重新與原先文件建立新的聯(lián)系《程序設(shè)計(jì)》198.3文件處理程序結(jié)構(gòu)和常用文件庫函數(shù)正文文件的輸入處理從正文文件逐一輸入字符,對輸入的字符作某種處理的程序結(jié)構(gòu)有:

intc;/*不能為char類型*/…/*說明有關(guān)變量和設(shè)置初值等*/fp=fopen(文件名,”r”);/*正文文件以讀方式打開*/while((c=fgetc(fp))!=EOF){…/*這里對剛讀入的字符信息c作某種處理*/}fclose(fp);…/*輸出處理結(jié)果*/《程序設(shè)計(jì)》20文件處理程序結(jié)構(gòu)和常用文件庫函數(shù)其中函數(shù)fgetc()的說明形式為

intfgetc(FILE*fp)該函數(shù)的功能是從與fp相聯(lián)系的文件中讀入下一個(gè)字符在文件的控制信息塊中,有一個(gè)當(dāng)前讀字符的位置信息,每讀入一個(gè)字符后,在文件還未結(jié)束情況下,這個(gè)當(dāng)前位置信息就移向其后一個(gè)字符,從而保證程序反復(fù)調(diào)用函數(shù)fgetc()能順序讀入文件中的字符函數(shù)fgetc()的返回值就是讀入字符的ASCII代碼值讀入字符時(shí),如遇到文件結(jié)束,函數(shù)返回文件結(jié)束標(biāo)志EOF。對于正文文件,由于字符的ASCII代碼不可能是-1,因此可用EOF(定義為-1)作為文件結(jié)束標(biāo)志《程序設(shè)計(jì)》21【例8.3.1】文件處理示例程序-1輸入正文文件,統(tǒng)計(jì)文件中英文字母的個(gè)數(shù),并輸出。設(shè)程序要統(tǒng)計(jì)的正文文件名在程序啟動時(shí)由輸入指定《程序設(shè)計(jì)》22#include<stdio.h>FILE*fp;intmain(){intcount,ch;charfname[40];printf(”輸入文件名!\n”);scanf(”%s%*c”,fname);/*讀入文件名和名后的回車符*/if((fp=fopen(fname,"r"))==NULL){printf("Cannotopen%sfile.\n",fname);return0;/*程序非正常結(jié)束*/}文件處理示例程序-1(續(xù))《程序設(shè)計(jì)》23count=0;while((ch=fgetc(fp))!=EOF){

/*這里對剛讀入的字符信息ch作某種處理*/if(ch>=’a’&&ch<=’z’||ch>=’A’&&ch<=’Z’)count++;}fclose(fp);

/*輸出處理結(jié)果*/printf(”文件%s有英文字母%d個(gè).\n”,fname,count);return1;/*程序執(zhí)行正常結(jié)束*/}文件處理程序結(jié)構(gòu)和常用文件庫函數(shù)二進(jìn)制文件的輸入處理從二進(jìn)制文件逐一輸入字節(jié),并作某種處理

charc;/*也可以是int類型*/…/*說明有關(guān)變量和設(shè)置初值等*/

fp=fopen(文件名,”rb”);while(!feof(fp)){c=fgetc(fp);…/*這里對字節(jié)信息c作某種處理*/}

fclose(fp);…/*輸出處理結(jié)果*/《程序設(shè)計(jì)》24文件處理程序結(jié)構(gòu)和常用文件庫函數(shù)函數(shù)feof()用來判斷文件是否結(jié)束函數(shù)調(diào)用feof(fp)用來測試與fp相聯(lián)系的文件當(dāng)前狀態(tài)是否為“文件結(jié)束”狀態(tài)如果是文件結(jié)束狀態(tài),函數(shù)調(diào)用feof(fp)返回非零值,否則返回零值函數(shù)feof()也可用于測試正文文件對于二進(jìn)制文件,讀入的某個(gè)字節(jié)信息變換成整數(shù)后可能是-1,所以一般不能以讀入字節(jié)的值是否為-1來判定二進(jìn)制文件是否結(jié)束,而應(yīng)該用函數(shù)feof()《程序設(shè)計(jì)》25文件處理程序結(jié)構(gòu)和常用文件庫函數(shù)逐一輸入字符(或字節(jié)),生成形成新文件字符(或字節(jié))逐一生成輸出,形成新文件的程序結(jié)構(gòu)

intc;/*也可以是char類型*/…/*說明有關(guān)變量和設(shè)置初值等*/fp=fopen(文件名,”w”);/*或fp=fopen(文件,”wb”)*/while(還有字符(或字節(jié))){…/*生成字符(或字節(jié))存于變量c*/fputc(c,fp);/*將生成的字符(或字節(jié))輸出*/}fclose(fp);…/*輸出程序結(jié)束報(bào)告*/《程序設(shè)計(jì)》26文件處理程序結(jié)構(gòu)和常用文件庫函數(shù)函數(shù)fputc()的說明形式為

intfputc(charch,FILE*fp)該函數(shù)的功能是將ch中的字符輸出到與fp文件指針相聯(lián)系的文件中。函數(shù)fputc()返回一個(gè)整值。如果輸出成功,則返回值就是輸出字符的ASCII代碼值;如果輸出失敗,則返回EOF,即-1函數(shù)putchar()是在stdio.h中用函數(shù)fputc()定義的宏:

#defineputchar(c)fputc(c,stdout)用宏putchar(c)比寫fputc(c,stdout)在概念上更簡單一些。從使用者來說,可以把putchar(c)看作函數(shù)調(diào)用,不必嚴(yán)格地稱它為宏調(diào)用《程序設(shè)計(jì)》27【例8.3.2】文件處理示例程序-2逐行復(fù)制從鍵盤讀入字符到指定文件,直至輸入空行結(jié)束。要求復(fù)制時(shí),在數(shù)字符序列與其它字符序列之間插入1個(gè)空格符。在復(fù)制過程中,程序還統(tǒng)計(jì)輸入字符和輸出字符個(gè)數(shù),并將統(tǒng)計(jì)結(jié)果輸出程序?yàn)榱伺卸ㄗ罱幚碜址彤?dāng)前字符的屬性,即是數(shù)字符或是其它字符,引入標(biāo)志變量pre_d和c_d。是數(shù)字符為1,不是數(shù)字符為0《程序設(shè)計(jì)》28#include<stdio.h>#defineINT_CH’’FILE*fp;voidmain(){intincount,outcount,ch,pre_d,c_d;charfname[40];文件處理示例程序-2(續(xù))《程序設(shè)計(jì)》29printf(”輸入文件名!\n”);scanf(”%s%*c”,fname);fp=fopen(fname,"w");/*以寫方式打開正文文件*/incount=outcount=0;while((ch=fgetc(stdin))!=’\n’){/*逐行處理*/incount++;pre_d=ch>=’0’&&ch<=’9’;fputc(ch,fp);outcount++;while((ch=fgetc(stdin))!=’\n’){incount++;c_d=ch>=’0’&&ch<=’9’;if(c_d!=pre_d){fputc(INT_CH,fp);pre_d=c_d;outcount++;}fputc(ch,fp);outcount++;}文件處理示例程序-2(續(xù))《程序設(shè)計(jì)》30incount++;fputc(ch,fp);/*輸出換行符*/outcount++;}incount++;/*統(tǒng)計(jì)最后一個(gè)換行符,但不輸入*/fclose(fp);

/*輸出處理結(jié)果*/printf(“共輸入%d個(gè)字符,輸出%d個(gè)字符。\n”,incount,outcount);}文件處理程序結(jié)構(gòu)和常用文件庫函數(shù)參照已知文件,生成新文件

參照已知文件,生成新文件,需同時(shí)打開兩個(gè)文件,一個(gè)用于讀,另一個(gè)用于寫以讀文件的狀態(tài)為循環(huán)控制條件在循環(huán)過程中,程序?qū)⒆x入內(nèi)容作某種處理后生成新的內(nèi)容輸出到新文件《程序設(shè)計(jì)》31【例8.3.3】文件處理示例程序-3逐行復(fù)制已知原文件,生成新文件。要求新文件是行定長文件,即新文件的每行字符個(gè)數(shù)保持一樣多。為此,程序逐行復(fù)制文件,當(dāng)源文件的一行字符不足時(shí),用空白符補(bǔ)充;當(dāng)源文件一行字符太長時(shí),就被截制成定長的多行復(fù)制《程序設(shè)計(jì)》32#include<stdio.h>#defineLEN30FILE*rfp,*wfp;intmain(){intinlen,ch;charrfname[40],wfname[40];printf("輸入源文件名!\n");scanf("%s%*c",rfname);printf("輸入新文件名!\n");scanf("%s%*c",wfname);wfp=fopen(wfname,"w");/*以寫方式打開正文文件*/文件處理示例程序-3(續(xù))《程序設(shè)計(jì)》33if((rfp=fopen(rfname,"r"))==NULL){printf("不能打開源文件%s.\n",rfname);return0;}while((ch=fgetc(rfp))!=EOF){inlen=0;while(ch!='\n'){fputc(ch,wfp);inlen++;if(inlen==LEN){/*對太長的行作截制*/fputc(‘\n’,wfp);/*換行*/inlen=0;}ch=fgetc(rfp);}文件處理示例程序-3(續(xù))《程序設(shè)計(jì)》34if(inlen){/*可能一行的最后一段不足定長要求*/while(inlen++<LEN)fputc('',wfp);fputc(‘\n’,wfp);/*換行*/inlen=0;}}if(inlen){/*可能最后一行不足定長要求*/while(inlen++<LEN)fputc('',wfp);fputc('\n',wfp);/*換行*/}fclose(wfp);fclose(rfp);printf("程序結(jié)束。\n");return1;}文件處理程序結(jié)構(gòu)和常用文件庫函數(shù)結(jié)構(gòu)化文件的輸入輸出應(yīng)用程序直接以流式文件為基礎(chǔ)編寫,是一件較繁瑣的工作應(yīng)用程序可以把文件看作是結(jié)構(gòu)化的文件。在結(jié)構(gòu)化文件中,文件中的數(shù)據(jù)信息呈現(xiàn)某種結(jié)構(gòu)形式人事檔案管理應(yīng)用中,代表每個(gè)人的信息是一個(gè)結(jié)構(gòu),讀寫的信息塊以人的基本信息結(jié)構(gòu)為單位,或每次讀寫一個(gè)人的信息或同時(shí)讀寫多個(gè)人的信息對于大容量文件,也希望能成批輸入或輸出,即程序每次調(diào)用輸入輸出庫函數(shù)能交換更多字符或字節(jié),這能大大地減少程序調(diào)用庫函數(shù)的次數(shù)C的輸入輸出函數(shù)庫也包含成批輸入輸出的庫函數(shù)最常用的兩個(gè)成批讀寫數(shù)據(jù)函數(shù)fread()和fwrite()《程序設(shè)計(jì)》35文件處理程序結(jié)構(gòu)和常用文件庫函數(shù)函數(shù)fread()的說明形式為intfread(char*buf,intsize,intcount,FILE*rfp);函數(shù)fwrite()的說明形式為intfwrite(char*buf,intsize,intcount,FILE*wfp);buf是字符數(shù)組首元指針對fread()來說,是存放讀入數(shù)據(jù)的開始地址對fwrite()來說,是要輸出數(shù)據(jù)的開始地址size是讀寫的數(shù)據(jù)塊的字節(jié)數(shù)count為要進(jìn)行讀寫的數(shù)據(jù)塊的個(gè)數(shù)fp為文件指針調(diào)用上述函數(shù)共讀寫size*count個(gè)字節(jié)或字符如果是讀寫二進(jìn)制文件,用函數(shù)fread()

和fwrite()

可以讀寫任何類型的信息《程序設(shè)計(jì)》36文件處理程序結(jié)構(gòu)和常用文件庫函數(shù)如有一個(gè)如下形式的通信錄結(jié)構(gòu)類型

typedefstruct{charname[21];/*名字*/charphone[15];/*電話*/charzip[10];/*郵編*/charaddr[31];/*地址*/}STU_TYPE;定義數(shù)組如STU_TYPEstud[30];表示結(jié)構(gòu)數(shù)組stud[]能存放30個(gè)通信錄數(shù)據(jù)則下面兩個(gè)函數(shù)調(diào)用能分別實(shí)現(xiàn)20個(gè)通信錄信息從某文件讀出和寫入某文件

fread(stud,sizeof(STU_TYPE),20,rfp);fwrite(stud,sizeof(STU_TYPE),20,wfp);《程序設(shè)計(jì)》37文件處理程序結(jié)構(gòu)和常用文件庫函數(shù)如要逐個(gè)讀入或?qū)懗鼋Y(jié)構(gòu)數(shù)組的每個(gè)元素,也可用循環(huán)如

for(i=0;i<20;i++)fread(&stud[i],sizeof(STU_TYPE),1,rfp);和

for(i=0;i<20;i++)fwrite(&stud[i],sizeof(STU_TYPE),1,wfp);調(diào)用函數(shù)fread()和fwrite()也有返回值,它的返回值是實(shí)際完成輸入或輸出的數(shù)據(jù)塊的個(gè)數(shù)《程序設(shè)計(jì)》38【例8.3.4】文件處理示例程序-4程序從鍵盤輸入通信錄信息,并把它們寫到文件中。然后,從文件讀出,并把它們顯示在終端顯示屏上從終端讀入通信錄數(shù)據(jù),存于變量stud。在輸入過程中,從輸入字符流中截取通信錄的一條有效信息存于stud中。然后程序又將這條信息存于文件中。接著程序又將它們從文件讀出,存于stud,并將它顯示在顯示屏上《程序設(shè)計(jì)》39#include<stdio.h>#include<string.h>charfname[40];typedefstruct{charname[15];/*名字*/charphone[15];/*電話*/charzip[10];/*郵編*/charaddr[31];/*地址*/}STU_TYPE;文件處理示例程序-4(續(xù))《程序設(shè)計(jì)》40STU_TYPEstud;FILE*fp;chars[80];intmain(){intcount;printf("輸入文件名!\n");scanf("%s%*c",fname);if((fp=fopen(fname,"wb"))==NULL){printf("Cannotopen%sfile.\n",fname);return0;}printf("Enterdata[名電話號碼郵編地址].\n");for(count=1;;count++){printf("輸入第%d個(gè)通信錄(空行結(jié)束):\n",count);文件處理示例程序-4(續(xù))《程序設(shè)計(jì)》41printf("名:");gets(s);if(strlen(s)==0)break;strncpy(,s,14);printf("電話號碼:");scanf("%s",s);strncpy(stud.phone,s,14);printf("郵編:");scanf("%s",s);strncpy(stud.zip,s,6);printf("地址:");scanf("%s%*c",s);strncpy(stud.addr,s,30);if(fwrite(&stud,sizeof(STU_TYPE),1,fp)!=1){printf("文件輸出出錯!.\n");fclose(fp);return1;}文件處理示例程序-4(續(xù))《程序設(shè)計(jì)》42}fclose(fp);fp=fopen(fname,"rb");while(fread(&stud,sizeof(STU_TYPE),1,fp)==1){printf("%-16s%15s%12s%32s\n",,stud.phone,stud.zip,stud.addr);}fclose(fp);return2;}其他常用庫函數(shù)簡介-1函數(shù)fprintf()和fscanf()fprintf()和fscanf()的作用分別與函數(shù)printf()和scanf()相仿,都是格式輸入和輸出函數(shù)。只是函數(shù)fprintf()和fscanf()的輸出輸入的對象是一般的文件。因此,也多了一個(gè)文件指針形參。一般調(diào)用形式為

fprintf(文件指針,格式字符串,輸出項(xiàng)表)

fscanf(文件指針,格式字符串,輸入項(xiàng)地址表)fprintf(wp,“i=%dr=%6.4f\n”,i,r);

表示將整型變量i和實(shí)型變量r的值按格式輸出到與wp相聯(lián)系的文件上fscanf(rp,"%d%f",&i,&r);

表示從與rp相聯(lián)系的文件為變量i和r讀入數(shù)據(jù)《程序設(shè)計(jì)》43fscanf、fprintf實(shí)例用戶輸入8個(gè)整型數(shù)據(jù),程序回顯并把數(shù)據(jù)寫到int.txt文件中,然后程序再從int.txt文件中讀取數(shù)據(jù),并顯示出來?!冻绦蛟O(shè)計(jì)》44#include<stdio.h>main(){

FILE*fp;inti,ss[8],new[8];for(i=0;i<8;i++){scanf("%d",&ss[i]);}

fp=fopen("int.txt","w");printf("startdiesplayolddata!/n");for(i=0;i<8;i++){printf("%d:%-10d/n",i+1,ss[i]);fprintf(fp,"%d,",ss[i]);

/*輸出數(shù)據(jù)時(shí)以逗號為數(shù)據(jù)之間的分隔符*/}《程序設(shè)計(jì)》45fclose(fp);printf("Nowdiseplayreaddate!/n");if((fp=fopen("int.txt","r"))==NULL)return1;for(i=0;i<8;i++){fscanf(fp,"%d,",&new[i]);

/*輸入數(shù)據(jù)時(shí)以逗號為數(shù)據(jù)之間的分隔符,這樣做到前后一致,讀取數(shù)據(jù)不會錯*/printf("%d:%-10d/n",i+1,new[i]);}

fclose(fp);}《程序設(shè)計(jì)》46其他常用庫函數(shù)簡介-2函數(shù)fgets()和fputs()函數(shù)fgets()和fputs()分別用于正文文件輸入和輸出字符串說明形式分別為

char*fgets(char*str,intn,FILE*fp)

fputs(char*str,FILE*fp)fgets()用于從文件讀取字符序列,并存于字符指針?biāo)赋龅拇鎯^(qū)域中。當(dāng)遇到換行符時(shí),讀字符過程結(jié)束函數(shù)fgets()與函數(shù)gets()都在讀入的字符序列之后自動存儲字符串結(jié)束標(biāo)志'\0',并返回字符串的首字符指針。函數(shù)fgets()除增加整型參數(shù)和文件指針參數(shù)之外,還在讀到換行符時(shí),存儲換行符,而函數(shù)gets()不存儲換行符fputs()將由str所指的字符串復(fù)制到fp所指文件,不在復(fù)制的字符序列之后另外再添加換行符《程序設(shè)計(jì)》47其他常用庫函數(shù)簡介-3函數(shù)rewind()、fseek()和ftell()程序即刻能讀寫的是文件某一位置上的數(shù)據(jù),這個(gè)位置稱為文件的當(dāng)前讀寫位置對于順序讀寫,每讀寫一個(gè)字符后,當(dāng)前位置就自動向后移一個(gè)字符位置對于隨機(jī)讀寫的文件,要讀寫其它位置上的數(shù)據(jù),就得改變文件當(dāng)前讀寫位置實(shí)現(xiàn)讀寫位置移動可調(diào)用庫函數(shù)rewind()和fseek()另設(shè)有函數(shù)ftell()用于查詢文件當(dāng)前讀寫位置《程序設(shè)計(jì)》48其他常用庫函數(shù)簡介-3函數(shù)rewind()與fseek()函數(shù)rewind()的說明形式為

voidrewind(FILE*fp)函數(shù)rewind()的作用是使文件當(dāng)前位置重新回到文件之首。該函數(shù)沒有返回值函數(shù)fseek()的說明形式為

fseek(FILE*fp,longoffset,intptrname)ptrname表示定位基準(zhǔn)函數(shù)fseek()是文件隨機(jī)存取的最主要函數(shù),用它可以將文件的當(dāng)前位置移到文件的任意位置上《程序設(shè)計(jì)》49其他常用庫函數(shù)簡介-3函數(shù)fseek()函數(shù)fseek()

中ptrname只允許0,1,或2。其中0代表以文件首為基準(zhǔn),1以當(dāng)前位置為基準(zhǔn),2以文件尾為基準(zhǔn);0、1和2分別被定義有名稱SEEK_SET、SEEK_CUR和SEEK_END。long型形參offset是位移量,表示以ptrname為基準(zhǔn),移動的字節(jié)數(shù)調(diào)用函數(shù)fseek()的例子

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é)處函數(shù)fseek()一般用于二進(jìn)制文件的隨機(jī)讀寫,因?yàn)槎M(jìn)制文件的數(shù)據(jù)表示形式與數(shù)據(jù)在內(nèi)存中的表示形式相同,各種類型的數(shù)據(jù)表示都有確定的字節(jié)數(shù)正文文件的數(shù)據(jù)表示形式與數(shù)據(jù)在內(nèi)存中的表示形式不同,在輸入輸出時(shí),數(shù)據(jù)內(nèi)外表示形式要進(jìn)行轉(zhuǎn)換,數(shù)值類型的數(shù)據(jù)在文件中的表示沒有固定的字節(jié)數(shù),計(jì)算位置時(shí)會發(fā)生混亂《程序設(shè)計(jì)》50其他常用庫函數(shù)簡介-3函數(shù)ftell()函數(shù)ftell()用于得到文件當(dāng)前位置相對于文件首的偏移字節(jié)數(shù)。在隨機(jī)方式存取文件時(shí),由于文件位置頻繁的前后移動,程序不容易確定文件的當(dāng)前位置。調(diào)用函數(shù)ftell()就能非常容易地確定文件的當(dāng)前位置函數(shù)ftell()的說明形式為

longftell(FILE*fp)利用函數(shù)ftell()也能方便地知道一個(gè)文件的長:

fseek(fp,0L,SEEK_END);當(dāng)前位置移到文件的末尾

len=ftell(fp);獲得當(dāng)前位置相對于文件首的位移《程序設(shè)計(jì)》51輸入輸出數(shù)據(jù)流重定向程序常從標(biāo)準(zhǔn)輸入文件讀數(shù)據(jù),向標(biāo)準(zhǔn)輸出文件輸出結(jié)果UNIX和DOS都支持?jǐn)?shù)據(jù)流重定向在啟動程序的命令行中,用改向輸入標(biāo)志“<”,能把標(biāo)準(zhǔn)輸入改成從某個(gè)文件讀入改向輸出標(biāo)志“>”,能把標(biāo)準(zhǔn)輸出改成向某個(gè)文件輸出《程序設(shè)計(jì)》52C文件概述文件類型和文件類型指針變量文件打開和關(guān)閉庫函數(shù)文件處理程序結(jié)構(gòu)和常用文件庫函數(shù)文件程序設(shè)計(jì)實(shí)例《程序設(shè)計(jì)》53提要文件程序設(shè)計(jì)實(shí)例-1把幾個(gè)文件串接在一起顯示的程序設(shè)運(yùn)行本程序的命令行呈以下形式

cat文件1

文件2…文件n并當(dāng)命令行不帶參數(shù)時(shí),缺省文件為標(biāo)準(zhǔn)輸入文件。遇參數(shù)文件不能打開情況,程序在標(biāo)準(zhǔn)出錯輸出文件上輸出不能打開文件的通知信息《程序設(shè)計(jì)》54#include<stdio.h>#include<stdlib.h>intmain(intargc,char*argv[]){FILE*fp;printf("Programstart!\n");if(argc==1)filecopy(stdin);文件程序設(shè)計(jì)實(shí)例-1(續(xù))《程序設(shè)計(jì)》55elsewhile(--argc>0)if((fp=fopen(*++argv,"r"))==NULL){fprintf(stderr,"Can'topen%s.\n",*argv);return1;}else{filecopy(fp);fclose(fp);}return0;}voidfilecopy(FILE*fp){intc;while((c=fgetc(fp))!=EOF)putchar(c);}文件程序設(shè)計(jì)實(shí)例-2一個(gè)分欄輸出程序:將正文分成頁、每頁又分若干欄的形式輸出。為此程序用一個(gè)三維數(shù)組buf[][][],控制從正文中讀出的當(dāng)前字符c填入buf[col][row][p],表示將c填入col欄row行的第p列每填入一個(gè)字符,p應(yīng)增1。填滿了欄中一行,或遇到正文中的換行符時(shí),row應(yīng)增1。當(dāng)填滿一欄時(shí),col應(yīng)增1,準(zhǔn)備填下一欄。當(dāng)一頁都填滿時(shí),程序就組織整頁版面的逐行輸出程序?yàn)榱藚^(qū)別正文的實(shí)際分行和因欄的總列數(shù)太少,程序給予的強(qiáng)制分行,程序在強(qiáng)制分行的續(xù)行之前不輸出正文的行號,對于正文原來的正文行,程序在輸出它們時(shí)先輸出它的行號。程序另假定正文不超過10000行《程序設(shè)計(jì)》56文件程序設(shè)計(jì)實(shí)例-2(續(xù))《程序設(shè)計(jì)》57#include<stdio.h>#defineLL80/*每行80列*/#defineCOL2

/*每頁2欄*/#defineINTV9

/**/#defineCSIZE(LL/COL-INTV)/*每欄寬度*/#definePL20

/*每頁20行*/#defineMARGIN3

/*每頁前后各空3行*/charbuf[COL][PL][CSIZE];intln[COL][PL];/*記錄對應(yīng)正文行在正文中的行號*/intcol,row,p;voidnewline();voidprintpage();文件程序設(shè)計(jì)實(shí)例-2(續(xù))《程序設(shè)計(jì)》58voidfileprint(FILE*fp)/*正文按頁按欄輸出*/{intlin,c;lin=col=row=p=0;while((c=fgetc(fp))!=EOF){ln[col][row]=++lin;/*記錄目前欄中行對應(yīng)行號*/while(c!='\n'&&c!=EOF){if(p>=CSIZE){newline();ln[col][row]=0;/*強(qiáng)制分行沒有行號*/

}buf[col][row][p++]=c;c=fgetc(fp);}/*endofwhile(c!='\n'&&c!=EOF)

*/文件程序設(shè)計(jì)實(shí)例-2(續(xù))《程序設(shè)計(jì)》59newline();if(c==EOF)break;}/*while((c=fgetc(fp))!=EOF)

*/while(col!=0||row!=0||p!=0){/*用空行填滿當(dāng)前頁*/ln[col][row]=0;newline();}fclose(fp);}文件程序設(shè)計(jì)實(shí)例-2(續(xù))《程序設(shè)計(jì)》60voidnewline(){while(p<CSIZE)/*當(dāng)前行剩余部分填空白符*/buf[col][row][p++]='';p=0;if(++row>=PL){/*換行,一欄滿*/row=0;if(++col>=COL){/*換欄,一頁滿*/col=0;printpage();/*一頁滿輸出*/}}}文件程序設(shè)計(jì)實(shí)例-2(續(xù))《程序設(shè)計(jì)》61voidprintpage(){intk,p,lpos,col,d;charaline[LL];aline[LL-1]='\0';for(k=0;k<MARGIN;k++)putchar(‘\n’);/*頁前空行*/for(k=0;k<PL;k++){/*輸出一頁內(nèi)的PL行*/for(p=0;p<LL-1;p++)aline[p]=‘’;/*用’’初始化行*/for(lpos=0,col=0;col<COL;lpos+=CSIZE+INTV,col++){d=ln[col][k];p=lpos+4;/*行號最多4位數(shù)*/while(d>0){aline[p--]=d%10+‘0’;/*行號*/d/=10; }/*行號求解并賦值*/for(p=0;p<CSIZE;p++)aline[lpos+7+p]=buf[col][k][p];/*行號和正文之間有空*/}/*在一行內(nèi),按欄輸出*/文件程序設(shè)計(jì)實(shí)例-2(續(xù))《程序設(shè)計(jì)》62printf("%s\n",aline);}for(k=0;k<MARGIN;k++)putchar(‘\n’);/*頁后空行*/}voidmain(){charfname[40];FILE*fp;printf("Enterfilename.\n");scanf("%s*c",fname);if((fp=fopen(fname,"r"))==NULL){printf("Can'topenfile%s!\n",fname);return;}fileprint(fp);}文件程序設(shè)計(jì)實(shí)例-3一個(gè)通信錄管理程序有以下功能:

.插入新的通信記錄;

.查找某人的通信記錄;

.刪除某人的通信記錄;

.瀏覽通信錄;

.結(jié)束程序運(yùn)行。設(shè)每條通信錄包含以下內(nèi)容:

.姓名

.地址

.郵政編碼

.電話號碼并設(shè)通信錄全部以字符行形式存于文件中,每四個(gè)字符行構(gòu)成一個(gè)通信錄記錄《程序設(shè)計(jì)》63文件程序設(shè)計(jì)實(shí)例-3(續(xù))程序啟動后,自動從指定的文件中讀取通信錄信息。程序運(yùn)行結(jié)束后,又自動將內(nèi)存中修改過的通信錄信息保護(hù)到文件中。為了查找,插入,刪除等操作的方便,以雙向鏈表組織通信錄信息設(shè)啟動程序的命令行可帶通信錄文件參數(shù)。如啟動時(shí)未給出文件名參數(shù),則程序首先要求用戶鍵入通信錄文件名程序運(yùn)行時(shí),反復(fù)請求輸入操作命令的提示信息

請輸入命令:[i,f,d,s,q]即要求用戶打入一條命令,它可以是i(插入)、f(尋找)、d(刪除)、s(顯示)以及q(結(jié)束程序運(yùn)行)。如果打入命令不是其中之一,將詳細(xì)顯示命令符及其意義的說明《程序設(shè)計(jì)》64文件程序設(shè)計(jì)實(shí)例-3(續(xù))命令表:

i:插入一條新的通信記錄.f:按輸入名查找通信錄.d:按輸入名刪除一條通信錄.s:瀏覽通信錄.q:退出.程序?qū)⑷客ㄐ配浗M織成一個(gè)雙向勾鏈的鏈表。接受顯示通信錄表的命令后,首先顯示的是第一條通信錄,由用戶鍵入u鍵或d鍵分別實(shí)現(xiàn)向上或向下選擇,顯示下一條通信錄。鍵入Esc鍵結(jié)束顯示命令。上述三鍵在顯示一條通信錄之后,在下面給出提示。重新接受用戶的選擇《程序設(shè)計(jì)》65文件程序設(shè)計(jì)實(shí)例-3(續(xù))《程序設(shè)計(jì)》66#include<stdio.h>#include<string.h>#include<stdlib.h>#defineMAXLEN120typedefstructsaddr{char*name;char*address;char*zip;char*phone;structsaddr*next,*pre;}ADDR;voidinsert(ADDR*ptr);/*輸入新的通信錄*/voidmake(ADDR*ptr,ADDR*p);/*將記錄*p插入鏈表*/文件程序設(shè)計(jì)實(shí)例-3(續(xù))《程序設(shè)計(jì)》67voidfind(ADDR*ptr);

/*按輸入名查找通信錄,并顯示*/voiddel(ADDR*ptr);/*按輸入名刪除通信錄*/voiddisplay(ADDR*ptr);/*顯示一個(gè)通信錄*/voidusage(void);/*告知命令用法*/voidshow(ADDR*ptr);/*瀏覽通信錄*/voidsave(ADDR*head,char*fname);

/*保存通信錄到文件*/ADDR*load(char*fname);/*讀出通信錄,建立雙向鏈表*/intgetstr(FILE*rfp,char**s);intgetbuffer(FILE*rfp);voidfreeall(ADDR*head);charbuffer[MAXLEN],fname[40];ADDR*load();FILE*fp;intmodified=0;文件程序設(shè)計(jì)實(shí)例-3(續(xù))《程序設(shè)計(jì)》68voidmain(intargc,char**argv){ADDR*head;charc;if(argc==1){printf("請輸入通信錄文件名.");scanf("%s%*c",fname);}elsestrcpy(fname,*++argv);head=load(fname);while(1){printf("\n請輸入命令:[i,f,d,s,q]\n");while(getbuffer(stdin)==0);if((c=buffer[0])=='q'){if(modified){printf("修改后的通信錄未保存,要保存嗎?(y/n)");文件程序設(shè)計(jì)實(shí)例-3(續(xù))《程序設(shè)計(jì)》69while(!(((c=getchar())>='a'&&c<='z')||(c>='A'&&c<='Z')));if(c=='y'||c=='Y')save(head,fname);}freeall(head);break;}switch(c){case'i':insert(head);break;case'f':find(head);break;case'd':del(head);break;case's':show(head);break;default:usage();break;}}}文件程序設(shè)計(jì)實(shí)例-3(續(xù))《程序設(shè)計(jì)》70voidinsert(ADDR*ptr)/*輸入新的通信錄*/{char*spt;ADDR*p;while(1){printf("名字?(立即回車表示結(jié)束)");if(getstr(stdin,&spt)==0)break;p=(ADDR*)malloc(sizeof(ADDR));p->name=spt;printf("地址?");getstr(stdin,&p->address);printf("郵編?");getstr(stdin,&p->zip);printf("電話號碼?");getstr(stdin,&p->phone);p->next=NULL;p->pre=NULL;make(ptr,p);modified=1;}}文件程序設(shè)計(jì)實(shí)例-3(續(xù))《程序設(shè)計(jì)》71voidmake(ADDR*ptr,ADDR*p)/*將*p插入鏈表*/{ADDR*pre,*suc;pre=ptr;suc=pre->next; while(suc){if(strcmp(suc->name,p->name)>=0)break;pre=suc;suc=pre->next;}pre->next=p;p->pre=pre;p->next=suc;if(suc)suc->pre=p;}文件程序設(shè)計(jì)實(shí)例-3(續(xù))《程序設(shè)計(jì)》72voidfind(ADDR*ptr)/*按輸入名查找通信錄,并顯示*/{ADDR*p;printf("輸入尋找的名:");while(getbuffer(stdin)==0);p=ptr->next;while(p){if(strcmp(buffer,p->name)==0)break;p=p->next;}if(p)display(p);elseprintf("末找到!\n");}文件程序設(shè)計(jì)實(shí)例-3(續(xù))《程序設(shè)計(jì)》73voiddel(ADDR*ptr)/*刪除指定的通信錄*/{ADDR*pre,*suc;printf("輸入要刪除的通信錄的名:");while(getbuffer(stdin)==0);/*跳過空行*/pre=ptr;suc=pre->next;while(suc){if(strcmp(suc->name,buffer)==0)break;pre=suc;suc=pre->next;}文件程序設(shè)計(jì)實(shí)例-3(續(xù))《程序設(shè)計(jì)》74if(suc){if(suc->next)suc->next->pre=pre;pre->next=suc->next;if(suc->name)free(suc->name);if(suc->address)free(suc->address);if(suc->phone)free(suc->phone);if(suc->zip)free(suc->zip);free(suc);modified=1;}elseprintf("Notfound!\n");}文件程序設(shè)計(jì)實(shí)例-3(續(xù))《程序設(shè)計(jì)》75voiddisplay(ADDR*ptr)/*顯示一個(gè)通信錄*/{printf("\n\t名:%s\n",ptr->name);printf("\t地址:%s\n",ptr->address);printf("\t郵編:%s\n",ptr->zip);printf("\t電話:%s\n",ptr->phone);}voidusage()/*告知命令用法*/{printf("\n命令表:\n");printf("i:插入一條新的通信錄.\n");printf("f:按輸入名尋找通信錄.\n");printf("d:按輸入名刪除一條通信錄.\n");printf("s:瀏覽通信錄.\n");printf("q:退出.\n");}文件程序設(shè)計(jì)實(shí)例-3(續(xù))《程序設(shè)計(jì)》76#defineUP‘u’#defineDOWN‘d’#defineEs

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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

提交評論