2021年中央電大C語言A課程輔導(dǎo)_第1頁
2021年中央電大C語言A課程輔導(dǎo)_第2頁
2021年中央電大C語言A課程輔導(dǎo)_第3頁
2021年中央電大C語言A課程輔導(dǎo)_第4頁
2021年中央電大C語言A課程輔導(dǎo)_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

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)長度

文獻(xiàn)中保存數(shù)據(jù)所占有存儲(chǔ)字節(jié)數(shù)。當(dāng)一種文獻(xiàn)用來保存記錄構(gòu)造數(shù)據(jù)時(shí),有

時(shí)也把保存記錄個(gè)數(shù)稱為文獻(xiàn)長度,此時(shí)文獻(xiàn)字節(jié)長度等于記錄個(gè)數(shù)乘以記錄構(gòu)造

類型長度。

?數(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)營

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)營

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長度)

并保存到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)營

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)營成果如下:

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ù)類型長度和個(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)營成果:

25364748546266737880

48622573668078543647

例3編一程序,從鍵盤上輸入若干條Pupil類型學(xué)生記錄到“Student.bin”

二進(jìn)制文獻(xiàn)中,當(dāng)輸入姓名為〃AAA〃后結(jié)束。假定Pupil類型包括兩個(gè)域,即學(xué)生姓

名和成績。

分析:定義文獻(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)營!\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);〃輸入成績

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é)生成績記錄,并輸出出來,同步記錄出學(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論