




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C語言程序設(shè)計(jì)A課程輔導(dǎo)(8)
—第8章文獻(xiàn)
重要內(nèi)容:
一、文獻(xiàn)概念
二、文獻(xiàn)打開和關(guān)閉
三、文本文獻(xiàn)訪問操作
四、二進(jìn)制文獻(xiàn)訪問操作
五、課程總復(fù)習(xí)
一、文獻(xiàn)概念
?文獻(xiàn)是計(jì)算機(jī)外部設(shè)備中一種被命名信息單位
>原則輸入輸出(I/O)設(shè)備文獻(xiàn):如stdin和stdout分別表達(dá)原則輸入設(shè)備鍵
盤和原則輸出設(shè)備顯示屏。這兩個(gè)文獻(xiàn)流標(biāo)記符在Stdio.h系統(tǒng)頭文獻(xiàn)中有定
義,類型為FILE*,其中文獻(xiàn)類型(FILE)也在stdio.h中定義。咱們可以隨時(shí)
從stdin中讀出(即從鍵盤輸入到內(nèi)存)信息,也可以隨時(shí)向stdout中寫入(從
內(nèi)存輸出到文獻(xiàn))信息。
>外存儲(chǔ)設(shè)備中保存文獻(xiàn):由顧客命名,并規(guī)定訪問文獻(xiàn)方式。如只容許向其寫
入信息輸出方式文獻(xiàn),只容許從已有文獻(xiàn)中讀出信息輸入方式文獻(xiàn),又容許寫
入又容許讀出輸入和輸出方式文獻(xiàn)等。
?文獻(xiàn)3種基本訪問方式
>輸入方式:從文獻(xiàn)讀出數(shù)據(jù)到內(nèi)存變量(數(shù)組)中保存。
>輸出方式:把內(nèi)存變量(數(shù)組)內(nèi)容送入到文獻(xiàn)中保存。
>既輸入又輸出方式:對(duì)于同一種文獻(xiàn),可以既進(jìn)行輸入又進(jìn)行輸出。
?文獻(xiàn)名
給需要使用數(shù)據(jù)文獻(xiàn)所起名字,它涉及文獻(xiàn)主名和擴(kuò)展名兩某些。符合命名規(guī)
定任何標(biāo)記符都可以作為主名,如可用gongzi作為工資文獻(xiàn)主名。擴(kuò)展名由1-3
個(gè)字符所構(gòu)成,如可用txt作為一種擴(kuò)展名。在一種文獻(xiàn)名中可以省略擴(kuò)展名。若
帶有擴(kuò)展名,則用句點(diǎn)與主名分開。如works.ran、工資.bin等。
?文獻(xiàn)類型和文獻(xiàn)流
在C語言系統(tǒng)中,系統(tǒng)預(yù)定義了一種文獻(xiàn)類型,文獻(xiàn)類型標(biāo)記符為FILE,當(dāng)需
要使用一種數(shù)據(jù)文獻(xiàn)時(shí).,必要依照該文獻(xiàn)名和訪問方式返回一種具備FILE類型指針
值,接著把這個(gè)值保存到具備FILE*類型指針變量中,后來就用這個(gè)指針變量(文
獻(xiàn)流)代替所相應(yīng)文獻(xiàn),完畢對(duì)文獻(xiàn)操作。咱們前面提到stdin和stdout分別是
系統(tǒng)定義原則輸入和輸出文獻(xiàn)流。
?文獻(xiàn)結(jié)束符(EOF)
在每個(gè)數(shù)據(jù)文獻(xiàn)結(jié)尾都運(yùn)用一種字節(jié)保存一種文獻(xiàn)結(jié)束標(biāo)記(T),在stdio.h
中,把T定義為符號(hào)常量EOF。
?文獻(xiàn)長(zhǎng)度
文獻(xiàn)中保存數(shù)據(jù)所占有存儲(chǔ)字節(jié)數(shù)。當(dāng)一種文獻(xiàn)用來保存記錄構(gòu)造數(shù)據(jù)時(shí),有
時(shí)也把保存記錄個(gè)數(shù)稱為文獻(xiàn)長(zhǎng)度,此時(shí)文獻(xiàn)字節(jié)長(zhǎng)度等于記錄個(gè)數(shù)乘以記錄構(gòu)造
類型長(zhǎng)度。
?數(shù)據(jù)文獻(xiàn)分類
C語句文獻(xiàn)按存儲(chǔ)信息方式不同可分為字符文獻(xiàn)和字節(jié)文獻(xiàn)兩種。字符文獻(xiàn)又
稱文本文獻(xiàn)或ASCII碼文獻(xiàn)。字節(jié)文獻(xiàn)又稱二進(jìn)制文獻(xiàn)或內(nèi)部格式文獻(xiàn)。
字符文獻(xiàn):文獻(xiàn)中保存字符串信息和數(shù)值信息都采用字符ASCH碼形式。固然
對(duì)于中文信息采用2字節(jié)中文區(qū)位碼。如保存常數(shù)23時(shí)?,相應(yīng)保存ASCH碼為50
和51o
字節(jié)文獻(xiàn):文獻(xiàn)中保存字符串信息仍采用字符ASCII碼形式,而保存數(shù)值信息
則采用其內(nèi)部格式。如保存常數(shù)23時(shí),由于它是一種int類型常數(shù),須占用4個(gè)字
節(jié),相應(yīng)保存二進(jìn)制數(shù)為00010111,前面尚有3個(gè)字節(jié)24個(gè)0。
?文獻(xiàn)操作函數(shù)
涉及打開文獻(xiàn)、關(guān)閉文獻(xiàn)、讀取數(shù)據(jù)、寫入數(shù)據(jù)、移動(dòng)文獻(xiàn)指針位置等,它們
函數(shù)原型都保存在系統(tǒng)頭文獻(xiàn)stdio.h中,調(diào)用這些函數(shù)時(shí)必要通過#include
命令包括此頭文獻(xiàn)。
二、文獻(xiàn)打開和關(guān)閉
1.打開數(shù)據(jù)文獻(xiàn)
要訪問一種文獻(xiàn),一方面要按照一定方式打開一種文獻(xiàn),并使之與一種文獻(xiàn)流
相聯(lián)系,然后才干進(jìn)行存取數(shù)據(jù)操作。當(dāng)對(duì)一種文獻(xiàn)解決操作結(jié)束后,就把它關(guān)閉
掉。
打開一種文獻(xiàn),需要調(diào)用C函數(shù)庫中fopen()函數(shù),得到相相應(yīng)文獻(xiàn)流。該函
數(shù)原型為:
FILE*fopen(constchar*fname,constchar*mode);
fname參數(shù):用于指向要打開文獻(xiàn)文獻(xiàn)名字符串,該字符串內(nèi)可以帶有盤符和
途徑名,若省略盤符和途徑名則隱含為當(dāng)前盤和當(dāng)前程徑,即保存當(dāng)前程序文獻(xiàn)磁
盤和途徑,
mode參數(shù):用于指定打開文獻(xiàn)方式,它也是以字符串形式給出,mode是指向
該字符串指針。
如果調(diào)用該函數(shù)成功,則返回一種文獻(xiàn)指針,即文獻(xiàn)名為fname、打開方式mode
所相應(yīng)文獻(xiàn)流,后來就運(yùn)用它操作文獻(xiàn)。如果調(diào)用該函數(shù)失敗,則返回空指針
(NULL),表白沒有打開指定文獻(xiàn),不能進(jìn)行訪問操作。
2.打開數(shù)據(jù)文獻(xiàn)方式
打開數(shù)據(jù)文獻(xiàn)方式有如下用字符串表達(dá)12中不同方式:
"r"〃打開一種用于輸入文本文獻(xiàn),若文獻(xiàn)不存在則打開失敗
〃打開一種用于輸出文本文獻(xiàn),存在清空,不存在則建立
"a"〃打開一種用于向尾部追加輸出文本文獻(xiàn),不存在則建立
"rb"〃打開一種用于輸入二進(jìn)制文獻(xiàn),若文獻(xiàn)不存在則打開失敗
"wb〃〃打開一種用于輸出二進(jìn)制文獻(xiàn),存在清空,不存在則建立
"ab〃〃打開一種用于向尾部追加輸出二進(jìn)制文獻(xiàn),不存在則建立
"r+〃〃打開一種用于讀/寫操作文本文獻(xiàn),不存在則打開失敗
,+"〃打開一種用于讀/寫操作文本文獻(xiàn),不存在則建立
"a+"〃打開一種用于讀/追加寫操作文本文獻(xiàn),不存在則建立
“rb+”〃打開一種用于讀/寫操作二進(jìn)制文獻(xiàn),不存在則打開失敗
“wb+”〃打開一種用于讀/寫操作二進(jìn)制文獻(xiàn),不存在則建立
“ab+”〃打開一種用于讀/追加寫操作二進(jìn)制文獻(xiàn),不存在則建立
總之:r(read)為讀、w(write)為寫、b(binary)為二進(jìn)制、+為讀/寫
3.打開數(shù)據(jù)文獻(xiàn)舉例
(1)FILE*fpl;〃定義一種文獻(xiàn)指針變量fpl
fpl=fopenCxxkl.dat\V9;〃以只寫方式打開當(dāng)前程徑和目錄中
〃本文文獻(xiàn)”xxkl.dat”,返回文獻(xiàn)流賦給文獻(xiàn)指針變量fpl
(2)FILE*fp2=fopen("d:\\C語言練習(xí)\\wr.dat","r");//以只讀方式
〃打開指定目錄內(nèi)文本文獻(xiàn)”wr.dat”,返回文獻(xiàn)流賦給fp2
(3)FILE*fp3=fopen("xxk2.ran","wb+”);〃為同步可以進(jìn)行讀/寫
〃和二進(jìn)制操作方式而打開當(dāng)前目錄中“xxk2.ran”文獻(xiàn),
〃返回文獻(xiàn)流賦給文獻(xiàn)指針變量fp3
4.數(shù)據(jù)文獻(xiàn)關(guān)閉
關(guān)閉一種文獻(xiàn),需要調(diào)用C函數(shù)庫中fclose()函數(shù),該函數(shù)原型為:
intfclose(FILE*fp);
如果fp所相應(yīng)文獻(xiàn)關(guān)閉成功則返回0,否則返回-1(EOF)表達(dá)失敗。
若要關(guān)閉已經(jīng)打開fpl文獻(xiàn)流所相應(yīng)”xxkl.dat”文獻(xiàn),則調(diào)用:
fclose(fpl);
打開一種文獻(xiàn)并解決結(jié)束后,最佳使用fcloseO函數(shù)調(diào)用關(guān)閉它,這樣才可以
保證暫時(shí)存儲(chǔ)在文獻(xiàn)緩沖區(qū)內(nèi)容所有寫入到外存文獻(xiàn)中。
三、文本文獻(xiàn)訪問操作
1.向文本文獻(xiàn)輸出數(shù)據(jù)
調(diào)用在stdio.h頭文獻(xiàn)中聲明fputc()函數(shù)或fputs()函數(shù)。這兩個(gè)函數(shù)原型為:
intfputc(intch,FILE*stream);〃向文獻(xiàn)寫入一種字符
intfputs(constchar*str,FILE*stream);〃向文獻(xiàn)寫入一種字符串
fputc函數(shù)在操作成功時(shí)返回原字符,否則返回
fputs函數(shù)在操作成功時(shí)返回0,否則返回T。
應(yīng)用舉例
例1向d盤xxk目錄下wrl.dat文獻(xiàn)依次輸出26個(gè)小寫英文字母。
分析:若d盤上沒有xxk目錄,則要一方面建立此目錄,然后才可以編寫C程序使
用此目錄建立文獻(xiàn)。在程序主函數(shù)中,一方面要依照文獻(xiàn)名和訪問方式打開此文獻(xiàn),
得到相應(yīng)文獻(xiàn)流,接著依次向其寫入26個(gè)小寫英文字母,最后關(guān)閉該文獻(xiàn)。此題參
照程序如下:
#include<stdio.h>
#include<stdlib.h>
voidmain(void)
(
inti;
FILE*fl;〃定義文獻(xiàn)指針以便保存文獻(xiàn)流
fl=fopenCd:\\xxk\\wr1.dat","w");〃以寫文本方式打開返回文獻(xiàn)流
if(fl-NULL){〃當(dāng)fl相應(yīng)文獻(xiàn)不存在則退出運(yùn)營(yíng)
printf("不可以打開文獻(xiàn)!\n");
exit(1);
)
for(i=0;i<26;i++)
fputcCa+i,fl);〃向fl文獻(xiàn)流輸出每個(gè)字母
fclose(fl);〃關(guān)閉fl所相應(yīng)文獻(xiàn)
}
通過使用操作系統(tǒng)提供記事本窗口可以查看該文獻(xiàn)內(nèi)容。
例2把從鍵盤上輸入若干行文本字符原原本本地存入到d盤xxk目錄下wr2.dat文
獻(xiàn)中,直到從鍵盤上輸入一空行(即只按下回車鍵)為止。
分析:此程序主函數(shù)同樣涉及定義文獻(xiàn)流、打開文獻(xiàn)、接受鍵盤輸入和寫文獻(xiàn)、關(guān)
閉文獻(xiàn)等操作。
#include<stdio.h>
#include<stdlib.h>
ttinclude<string.h>
voidmain(void)
charstr[80];〃定義一種字符數(shù)組,保存輸入一行字符
FILE*f2;〃定義文獻(xiàn)指針對(duì)象,用來保存一種文獻(xiàn)流
f2=fopen(/zd:\\xxk\\wr2.dat","w");〃以寫方式訪問文獻(xiàn)
if(!f2){〃當(dāng)f2打開失敗時(shí)退出運(yùn)營(yíng)
printf("CannotopenFile.\nz/);
exit(1);
)
printf("在下面輸入若干行文本建立文本文獻(xiàn):\n");
while(1){〃執(zhí)行while循環(huán)
gets(str);〃用str保存從鍵盤上輸入一行字符
strcat(str,"\n");〃在字符串末尾添加一種換行符
if(*str=='\n')break;〃若輸入是空串則離開循環(huán)
fputs(str,f2);〃把str所指向字符串寫入到f2文獻(xiàn)
)
fclose(f2);〃關(guān)閉f2所相應(yīng)文獻(xiàn)
)
2.從文本文獻(xiàn)輸入數(shù)據(jù)
調(diào)用在stdio.h頭文獻(xiàn)中聲明fgetcO函數(shù)或fgetsO函數(shù)。這兩個(gè)函數(shù)原型為:
intfgetc(FILE*stream);
char*fgets(char*str,intlength,FILE*stream);
fgetc函數(shù)從文獻(xiàn)流中當(dāng)前字節(jié)位置讀出一種字符并返回。若讀到文獻(xiàn)結(jié)束標(biāo)
記則返回
fputs函數(shù)從文獻(xiàn)流中當(dāng)前字節(jié)位置起讀出一行字符(要不大于length長(zhǎng)度)
并保存到str字符數(shù)組空間,同步返回str值。若沒有讀到任何內(nèi)容則返回NULL。
應(yīng)用舉例
例3從上面例1所建立"d:\xxk\wrl.dat”文獻(xiàn)中輸入所有數(shù)據(jù)并依次顯示到屏幕
上。
分析:該文獻(xiàn)保存著26個(gè)小寫英文字符,以讀方式打開該文獻(xiàn)后,文獻(xiàn)當(dāng)前訪問
位置是文獻(xiàn)開始位置,即第1個(gè)字節(jié)位置,每次讀出一種字節(jié)內(nèi)容(字符)后,當(dāng)
前訪問位置自動(dòng)后移,接著可以讀取下一種字符。程序如下:
#include<stdio.h>
#include<stdlib.h>
voidmain(void)
(
charch;
FILE*f3=fopen("d:\\xxk\\wrl.dat","r");〃得到輸入文獻(xiàn)流
if(!f3){〃當(dāng)f3打開失敗時(shí)退出程序運(yùn)營(yíng)
printf(??d:\\xxk\\wrl.datfilenotopen!\nz,);
exit(1);
)
ch=fgetc(f3);〃從文獻(xiàn)開始處讀出一種字符
while(ch!=EOF){//ch不等于文獻(xiàn)結(jié)束符時(shí)則循環(huán)
printfch);〃向屏幕窗口輸出ch所保存字符
ch=fgetc(f3);〃繼續(xù)從文獻(xiàn)讀出一種字符
printf("\n");
fclose(f3);〃關(guān)閉f3所相應(yīng)文獻(xiàn)
該程序運(yùn)營(yíng)成果如下:
abcdefghijkImnopqrstuvwxyz
例4從上面例2所建立“d:\xxk\wr2.dat”文獻(xiàn)中按行讀出所有數(shù)據(jù),并把它們依
次顯示到屏幕上,同步記錄出文獻(xiàn)內(nèi)容中行數(shù)。
分析:一方面以讀方式打開文獻(xiàn)返回文獻(xiàn)流,接著從文獻(xiàn)頭開始依次讀出每行字符
串并顯示輸出和計(jì)數(shù),最后關(guān)閉文獻(xiàn)。
#include<stdio.h>
#include<stdlib.h>
voidmain(void)
(
inti=0;〃定義i用來記錄行數(shù)
charstr[80];〃定義str數(shù)組用來保存一行字符串
FILE*f4=fopen("d:\\xxk\\wr2.dat","r");〃得到相應(yīng)文獻(xiàn)流
if(!f4){printf("文獻(xiàn)沒有打開!\n");exit(l);)
while(!feof(f4))〃文獻(xiàn)未結(jié)束時(shí)執(zhí)行循環(huán)
char*p=fgets(str,80,f4);〃讀出一行字符串到str字符數(shù)組
if(!p)break;〃若從文獻(xiàn)中沒有讀到內(nèi)容則退出
printfstr);〃向屏幕輸出str所指向字符串
i++;〃行數(shù)增1
printf("文本文獻(xiàn)中行數(shù)為:%d\n/z,i);
fclose(f4);〃關(guān)閉f4所相應(yīng)文獻(xiàn)
四、二進(jìn)制文獻(xiàn)訪問操作
?讀出和寫入信息函數(shù)
對(duì)二進(jìn)制文獻(xiàn)是按固定字節(jié)數(shù)進(jìn)行信息讀寫訪問操作。調(diào)用在Stdio.h頭文獻(xiàn)
中聲明freadO函數(shù)可以從二進(jìn)制文獻(xiàn)中讀出固定字節(jié)數(shù)信息,調(diào)用fwriteO函數(shù)
可以向二進(jìn)制文獻(xiàn)中寫入固定字節(jié)數(shù)信息。這兩個(gè)函數(shù)原型為:
unsignedintfread(void*buffer,unsignedintnum,
unsignedintcount,FILE*stream);
unsignedintfwrite(constvoid*buffer,unsignedintnum,
unsignedintcount,FILE*stream);
參數(shù)闡明:stream參數(shù)給出要進(jìn)行操作二進(jìn)制文獻(xiàn)流,num和count參數(shù)分別
表達(dá)待讀寫信息塊中一種數(shù)據(jù)類型長(zhǎng)度和個(gè)數(shù),它們之積為信息塊字節(jié)數(shù),buffer
參數(shù)所指向存儲(chǔ)空間是信息在內(nèi)存中保存地點(diǎn)。
函數(shù)功能:調(diào)用fread函數(shù)是從stream所示文獻(xiàn)中當(dāng)前字節(jié)位置讀出
num*count個(gè)字節(jié)信息并保存到由buffer所指向存儲(chǔ)空間中。調(diào)用fwrite函數(shù)是
把從buffer所指向存儲(chǔ)空間中num*count個(gè)字節(jié)信息寫入到由stream所示文獻(xiàn)中,
從當(dāng)前字節(jié)位置起向后存儲(chǔ)。
?移動(dòng)文獻(xiàn)指針位置(當(dāng)前待讀寫字節(jié)位置)
在stdio.h頭文獻(xiàn)中還提供有移動(dòng)文獻(xiàn)指針位置函數(shù):
intfseek(FILE*stream,longintnumintorigin);
功能:運(yùn)用該函數(shù)可以把文獻(xiàn)指針位置移動(dòng)到整個(gè)文獻(xiàn)中任何字節(jié)位置。隨時(shí)
從這個(gè)位置起讀寫信息。
參數(shù)闡明:
stream參數(shù)給出要進(jìn)行操作文獻(xiàn)流。
origin參數(shù)必要是三個(gè)符號(hào)常量SEEK_SET、SEEK_CUR或SEEK_END之一。它們
在stdio.h頭文獻(xiàn)中定義。
SEEK_SET表達(dá)文獻(xiàn)開始位置,即第1個(gè)字節(jié)位置;SEEK_END表達(dá)文獻(xiàn)結(jié)尾位
置,即保存文獻(xiàn)結(jié)束標(biāo)記位置;SEEK/UR表達(dá)當(dāng)前文獻(xiàn)指針位置。
num參數(shù)給出移動(dòng)文獻(xiàn)位置指針位移量,為正數(shù)時(shí)則表達(dá)從origin所給參照點(diǎn)
向后移動(dòng)num個(gè)字節(jié),為負(fù)數(shù)時(shí)表達(dá)向前移動(dòng)num個(gè)字節(jié),移動(dòng)后位置就是當(dāng)前文
獻(xiàn)指針位置。
調(diào)用該函數(shù)時(shí),若文獻(xiàn)位置指針移動(dòng)成功,則返回0,否則返回非0值。
?應(yīng)用舉例
例1編一程序,一方面運(yùn)用48、62、25、73、66、80、78、54、36、47等10
個(gè)整數(shù)初始化一種整型數(shù)組a[10],接著把a(bǔ)中每個(gè)元素值依次寫入到二進(jìn)制文獻(xiàn)
“d:\xxk\data.bin”中,然后再對(duì)數(shù)組a進(jìn)行升序排序,把排序成果再一次寫入到
上述二進(jìn)制文獻(xiàn)中。
分析:一方面以二進(jìn)制寫方式打開給定文獻(xiàn),接著把數(shù)組a[10]中數(shù)據(jù)寫入到
文獻(xiàn)中,再接著對(duì)數(shù)組a[10]進(jìn)行升序排列,最后再把數(shù)組a[10]中數(shù)據(jù)寫入到文獻(xiàn)
中。對(duì)數(shù)組a[10]進(jìn)行升序排列可以單獨(dú)編寫出函數(shù)定義。程序如下:
#include<stdio.h>
#include<stdlib.h>
inta[10]={48,62,25,73,66,80,78,54,36,47);〃定義并初始化數(shù)組
voidSeleteSort(inta[],intn)〃對(duì)數(shù)組a[10]進(jìn)行升序排序
{〃采用選取排序辦法
inti,j,k,x;
for(i=l;i<n;i++)(〃順序比較和互換nT次
k=iT;
for(j=i;j<n;j++)〃k為當(dāng)前比較區(qū)間內(nèi)最小元素下標(biāo)
if(a[j]<a[k])k=j;
x=a[i-l];a[i-l]=a[k];a[k]=x;〃互換
voidmain(void)
(
inti;
FILE*fpl;
fpl=fopen("d:\\xxk\\data.bin","wb");〃以二進(jìn)制寫打開文獻(xiàn)
if(!fpl){printf("文獻(xiàn)沒有打開!\n");exit(l);}
for(i=0;i<10;i++)〃向文獻(xiàn)寫入a數(shù)組中每個(gè)元素值
fwrite(&a[i],sizeof(int),1,fpl);
SeleteSort(a,10);〃調(diào)用排序算法
fwrite(a,sizeof(int),10,fpl);//把數(shù)組a[10]一次寫入文獻(xiàn)
fclose(fpl);〃關(guān)閉fpl所相應(yīng)文獻(xiàn)
)
例2從例1所建立二進(jìn)制文獻(xiàn)中,一方面讀出文獻(xiàn)后半某些保存按升序排列
10個(gè)整數(shù)并顯示,然后再讀出前半某些保存10個(gè)整數(shù)并顯示出來。
分析:依照文獻(xiàn)名和訪問方式定義文獻(xiàn)流,移動(dòng)文獻(xiàn)位置指針,讀取后10個(gè)
有序數(shù)據(jù),再把文獻(xiàn)指針位置移到文獻(xiàn)開始,再讀取前10個(gè)數(shù)據(jù)。
#include<stdio.h>
#include<stdlib.h>
inta[10];〃用來保存從文獻(xiàn)中讀取10個(gè)整數(shù)
voidmain(void)
(
inti;
FILE*fpl;
fpl=fopen(〃d:\\xxk\\data.bin〃,〃rb〃);〃以二進(jìn)制讀打開文獻(xiàn)
if(!fpl){printf(〃文獻(xiàn)沒有打開!\n〃);exit(l);)
fseek(fpl,10*sizeof(int),SEEKSET);
〃把文獻(xiàn)指針位置移到10個(gè)整數(shù)之后,即第11個(gè)整數(shù)位置
fread(a,sizeof(int),10,fpl);
〃一次讀出后10個(gè)整數(shù)到a[10]數(shù)組中保存
for(i=0;i<10;i++)printf(,z%d〃,a[i]);
〃依次顯示出按升序排列10個(gè)整數(shù)
printf(〃\n〃);
fseek(fpl,0,SEEKSET);〃把文獻(xiàn)位置指針移到文獻(xiàn)開始位置
for(i=0;i<10;i++){〃依次讀出并顯示前10個(gè)整數(shù)
fread(&a[i],sizeof(int),1,fpl);
printf(〃%d〃,a[i]);
printf(〃\n〃);
fclose(fpl);〃關(guān)閉fpl所相應(yīng)文獻(xiàn)
程序運(yùn)營(yíng)成果:
25364748546266737880
48622573668078543647
例3編一程序,從鍵盤上輸入若干條Pupil類型學(xué)生記錄到“Student.bin”
二進(jìn)制文獻(xiàn)中,當(dāng)輸入姓名為〃AAA〃后結(jié)束。假定Pupil類型包括兩個(gè)域,即學(xué)生姓
名和成績(jī)。
分析:定義文獻(xiàn)流、從鍵盤輸入和向文獻(xiàn)流寫入每個(gè)學(xué)生記錄、關(guān)閉文獻(xiàn)。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
structPupil{charname[10];intgrade;};〃定義學(xué)生記錄構(gòu)造
structPupilx;〃定義學(xué)生構(gòu)造變量
voidmain(void){
char*p=〃Student.bin”;〃定義文獻(xiàn)名字符串
FILE*fpl=fopen(p,〃wb〃);〃以二進(jìn)制寫方式打開文獻(xiàn)
if(!fpl){printf(〃文獻(xiàn)沒有打開,退出運(yùn)營(yíng)!\n〃);exit(1);)
printf(〃請(qǐng)輸入若干條學(xué)生記錄,輸入姓名AAA后結(jié)束:\n〃);
while(1){
scanf(〃%s〃,x.name);〃輸入姓名
if(strcmp(x.name,〃AAA〃)=0)break;〃輸入結(jié)束退出循環(huán)
scanf(〃淑1〃,&x,grade);〃輸入成績(jī)
fwrite(&x,sizeof(x),1,fpl);〃向文獻(xiàn)寫入一條記錄
fclose(fpl);
printf("數(shù)據(jù)輸入完畢,程序正常結(jié)束.\n");
)
假定從鍵盤上輸入和顯示成果如下:
請(qǐng)輸入若干條學(xué)生記錄,輸入姓名AAA后結(jié)束:
zhshj76
hgyin84
shian68
zhb92
zjmin70
xjip63
AAA
數(shù)據(jù)輸入完畢,程序正常結(jié)束.
此6條學(xué)生記錄被依次保存到“Student.bin”二進(jìn)制文獻(xiàn)中,每個(gè)記錄所占有
字節(jié)數(shù)為sizeof(structPupil)>這個(gè)文獻(xiàn)占有6*sizeof(structPupil)+1字節(jié)。
例4編一程序,從例3建立“Student,bin”二進(jìn)制文獻(xiàn)中,依次讀出每個(gè)Pupil
類型學(xué)生成績(jī)記錄,并輸出出來,同步記錄出學(xué)生記錄數(shù)。
#include<stdio.h>
#include<stdlib.h>
structPupil{charname[10];intgrade;);〃學(xué)生類型定義
voidPrint(FILE*fio);〃打印輸出文獻(xiàn)中所有記錄
intCount(FILE*fio);〃記錄出文獻(xiàn)中所有記錄數(shù)
voidmain(void)
FILE*fio=fopen("Student,bin”,〃rb+〃);
〃以二進(jìn)制讀寫方式打開文獻(xiàn)
if(!fio){
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 汞中毒患者的護(hù)理
- 我要當(dāng)學(xué)霸課件-高一下學(xué)期學(xué)習(xí)方法指導(dǎo)主題班會(huì)
- 外匯和配套人民幣借款合同范例二零二五年
- 電腦維護(hù)合同模板
- 主播合同經(jīng)紀(jì)協(xié)議二零二五年
- 二手房屋買賣協(xié)議書樣本
- 二零二五合同簽訂授權(quán)委托書
- 店面租賃合同參考示例
- 期末數(shù)學(xué)四上試卷及答案
- 七下期末試卷福建及答案
- 《犯罪學(xué)》教學(xué)大綱
- 詩歌藝術(shù)手法:《揚(yáng)州慢》【知識(shí)精講+備課精研】 高二語文課內(nèi)知識(shí)點(diǎn)拓展延伸(統(tǒng)編版選擇性必修下冊(cè))
- GA/T 1509-2018法庭科學(xué)現(xiàn)場(chǎng)制圖規(guī)范
- 臨床醫(yī)學(xué)概要課件
- 模板及支撐計(jì)算書
- 中醫(yī)藥方大全教學(xué)教材
- 電信智慧家庭工程師3級(jí)認(rèn)證考試題庫-下(判斷題大全)
- 海綿鈦生產(chǎn)工藝
- 整數(shù)與小數(shù)的認(rèn)識(shí)整理與復(fù)習(xí)課件
- 會(huì)計(jì)報(bào)表 資產(chǎn)負(fù)債表02
- 成人與小兒手術(shù)麻醉前禁食指南
評(píng)論
0/150
提交評(píng)論