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

下載本文檔

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

文檔簡(jiǎn)介

項(xiàng)目八文件——計(jì)算電話費(fèi)任務(wù)一了解文件任務(wù)二了解文件指針任務(wù)三文件的打開(kāi)與關(guān)閉任務(wù)四文件的讀寫(xiě)任務(wù)五文件定位和文件的隨機(jī)讀寫(xiě).任務(wù)六項(xiàng)目實(shí)現(xiàn)思考與練習(xí)

任務(wù)一了解文件

所謂“文件”是指一組相關(guān)數(shù)據(jù)的有序集合。這個(gè)數(shù)據(jù)集有一個(gè)名稱,叫做文件名。文件通常存儲(chǔ)在外部介質(zhì)(如磁盤(pán)等)上,在使用時(shí)才被調(diào)入內(nèi)存中。從不同的角度可對(duì)文件作不同的分類。

從用戶的角度看,文件可分為普通文件和設(shè)備文件兩種。普通文件是指存儲(chǔ)在磁盤(pán)或其他外部介質(zhì)上的一個(gè)有序數(shù)據(jù)集,可以是源文件、目標(biāo)文件、可執(zhí)行程序,也可以是一組待輸入處理的原始數(shù)據(jù),或者是一組輸出的結(jié)果。

設(shè)備文件是指與主機(jī)相連的各種外部設(shè)備,如顯示器、打印機(jī)、鍵盤(pán)等。在操作系統(tǒng)中,可以把外部設(shè)備也看作是一個(gè)文件來(lái)進(jìn)行管理,把對(duì)它們的輸入、輸出等同于對(duì)磁盤(pán)文件的讀和寫(xiě)。

從文件編碼的方式來(lái)看,文件可分為ASCII文件和二進(jìn)制文件兩種。ASCII文件也稱為文本文件,這種文件在磁盤(pán)中存放時(shí)每個(gè)字符對(duì)應(yīng)一個(gè)字節(jié),用于存放對(duì)應(yīng)的ASCII字符。

例如,數(shù)字5678以ASCII字符的形式存儲(chǔ)占4個(gè)字節(jié),其存儲(chǔ)形式為

ASCII字符:00110101001101100011011100111000

十進(jìn)制字符:

5

6

7

8

ASCII文件可在屏幕上按字符顯示。例如,源程序文件就是ASCII文件,用DOS命令TYPE可顯示文件的內(nèi)容。由于是按字符顯示,因此能讀懂文件內(nèi)容。

二進(jìn)制文件是按二進(jìn)制的編碼方式來(lái)存放文件的。

例如,數(shù)字5678以二進(jìn)制的形式存儲(chǔ)只占兩個(gè)字節(jié),其存儲(chǔ)形式為

0001011000101110

二進(jìn)制文件雖然也可在屏幕上顯示,但其內(nèi)容無(wú)法讀懂。C語(yǔ)言系統(tǒng)在處理這些文件時(shí),并不區(qū)分類型,都看成是字符流,按字節(jié)進(jìn)行處理。輸入輸出字符流的開(kāi)始和結(jié)束只由程序控制而不受物理符號(hào)(如回車符)的控制,因此,也把這種文件稱作“流式

文件”。

任務(wù)二了解文件指針

在使用文件系統(tǒng)時(shí),每一個(gè)文件被打開(kāi)或創(chuàng)建之后,必須用文件類型指針作為該文件的文件標(biāo)識(shí)。在C語(yǔ)言編譯系統(tǒng)中都有文件結(jié)構(gòu)類型FILE的定義,在程序設(shè)計(jì)中可以直接用FILE定義文件類型指針變量。定義文件類型指針變量的一般形式為

FILE*文件指針變量名;

注意:FILE必須用大寫(xiě),且“*”不能省略。

例如,F(xiàn)ILE*fp;,其中,fp是一個(gè)指向FILE類型結(jié)構(gòu)的指針變量,通過(guò)文件指針變量能夠找到與它相關(guān)的文件。如果需要同時(shí)訪問(wèn)n個(gè)文件,一般應(yīng)設(shè)n個(gè)指針變量(指向FILE類型結(jié)構(gòu)的指針變量),使它們分別指向n個(gè)文件(實(shí)際上是指向該文件的信息結(jié)構(gòu)),以實(shí)現(xiàn)對(duì)文件的訪問(wèn)。當(dāng)然,同一指針變量通過(guò)對(duì)它進(jìn)行賦值也可以指向不同的文件。

任務(wù)三文件的打開(kāi)與關(guān)閉

1.文件的打開(kāi)(fopen函數(shù))

fopen函數(shù)用來(lái)打開(kāi)一個(gè)文件,其調(diào)用的一般形式為文件指針名=fopen(文件名,使用文件方式);其中,“文件指針名”必須是被說(shuō)明為FILE類型的指針變量;“文件名”是被打開(kāi)文件的文件名;“使用文件方式”是指文件的類型和操作要求。“文件名”是字符串常量或字符串?dāng)?shù)組。

例如,在本項(xiàng)目中需要打開(kāi)文本文件“dial.txt”來(lái)讀取通話記錄。

FILE*fp;

fp=fopen("dial.txt","r");

其意義是在當(dāng)前目錄下打開(kāi)文件“dial.txt”,只允許進(jìn)行“讀”操作,并使fp指向該文件。又如,

FILE*fphzk;

fphzk=fopen("c:\\hzk16","rb");

其意義是打開(kāi)C驅(qū)動(dòng)器磁盤(pán)根目錄下的文件hzk16,這是一個(gè)二進(jìn)制文件,只允許按二進(jìn)制方式進(jìn)行讀操作。兩個(gè)反斜線“\\”中的第一個(gè)表示轉(zhuǎn)義字符,第二個(gè)表示根目錄。

文件的使用方式共有12種,表8.1給出了它們的符號(hào)和意義。

對(duì)于文件使用方式有以下幾點(diǎn)說(shuō)明:

(1)文件使用方式由r、w、a、t、b、+?6?個(gè)字符拼成,各字符的含義如下。

r(read): 讀

w(write): 寫(xiě)

a(append): 追加

t(text): 文本文件,可省略不寫(xiě)

b(banary): 二進(jìn)制文件

+:

讀和寫(xiě)

(2)凡用“r”打開(kāi)一個(gè)文件時(shí),該文件必須已經(jīng)存在,且只能從該文件讀出。

(3)用“w”打開(kāi)的文件只能向該文件寫(xiě)入。若打開(kāi)的文件不存在,則以指定的文件名建立該文件;若打開(kāi)的文件已經(jīng)存在,則將該文件刪去,重建一個(gè)新文件。

(4)若要向一個(gè)已存在的文件追加新的信息,只能用“a”方式打開(kāi)文件,但此時(shí)該文件必須是存在的,否則將會(huì)出錯(cuò)。

(5)在打開(kāi)一個(gè)文件時(shí),如果出錯(cuò),fopen將返回一個(gè)空指針值NULL。在程序中可以用這一信息來(lái)判別是否完成打開(kāi)文件的工作,并作相應(yīng)的處理。因此,常用以下程序段打開(kāi)文件:

fp=fopen("dial.txt","r");

if(!fp)

{

printf("\nerroronopendial.txt!");

return-1;

}

這段程序的意義是:如果返回的指針為空,表示不能打開(kāi)文件“dial.txt”,同時(shí)給出提示信息“erroronopendial.txt!”,退出程序。

(6)把一個(gè)文本文件讀入內(nèi)存時(shí),要將ASCII字符轉(zhuǎn)換成二進(jìn)制字符;而把文件以文本方式寫(xiě)入磁盤(pán)時(shí),也要把二進(jìn)制字符轉(zhuǎn)換成ASCII字符,因此文本文件的讀寫(xiě)要花費(fèi)較多的轉(zhuǎn)換時(shí)間。對(duì)二進(jìn)制文件的讀寫(xiě)不存在這種轉(zhuǎn)換。

(7)標(biāo)準(zhǔn)輸入文件(鍵盤(pán))、標(biāo)準(zhǔn)輸出文件(顯示器)、標(biāo)準(zhǔn)出錯(cuò)輸出(出錯(cuò)信息)是由系統(tǒng)打開(kāi)的,可直接使用。

2.文件的關(guān)閉(fclose函數(shù))

文件一旦使用完畢,應(yīng)用關(guān)閉文件函數(shù)把文件關(guān)閉,以避免文件的數(shù)據(jù)丟失等錯(cuò)誤。

fclose函數(shù)調(diào)用的一般形式為

fclose(文件指針);

例如,

fclose(fp);

正常完成關(guān)閉文件操作時(shí),fclose函數(shù)的返回值為0。如返回非零值,則表示有錯(cuò)誤發(fā)生。

任務(wù)四文件的讀寫(xiě)

1.讀寫(xiě)字符

C語(yǔ)言提供了fgetc和fputc函數(shù)對(duì)文本文件進(jìn)行字符的讀寫(xiě),其函數(shù)的原型存于stdio.h頭文件中,格式為

intfgetc(FILE*stream)

fgetc()函數(shù)從輸入流的當(dāng)前位置返回一個(gè)字符,并將文件指針指示器移到下一個(gè)字符處,如果已到文件結(jié)尾,函數(shù)返回EOF,此時(shí)表示本次操作結(jié)束。

若讀寫(xiě)文件完成,則應(yīng)關(guān)閉文件。

intfputc(intch,FILE*stream)

fputc()函數(shù)完成將字符ch的值寫(xiě)入所指定的流文件的當(dāng)前位置處,并將文件指針后移一位。fputc()函數(shù)的返回值是所寫(xiě)入字符的值,出錯(cuò)時(shí)返回EOF。

【例8-1】將存放于磁盤(pán)的指定文本文件按讀寫(xiě)字符方式逐個(gè)地從文件讀出,然后再將其顯示到屏幕上。

運(yùn)行結(jié)果如下:

pleaseenterfilename:dial.txt

o14:05:2314:11:2582346789

i15:10:0016:01:1513890000000

o10:53:1211:07:0563000123

o23:01:1200:12:1513356789001

【例8-2】從鍵盤(pán)輸入字符,存到磁盤(pán)文件test.txt中。

程序通過(guò)從鍵盤(pán)輸入一個(gè)以回車結(jié)束的字符串,寫(xiě)入指定的流文件test.txt,文件以文本只寫(xiě)方式打開(kāi),所以流文件具有可讀性,能支持各種字符處理工具訪問(wèn)。

運(yùn)行程序:

Ilovechina!

2.讀寫(xiě)字符串

C語(yǔ)言提供的讀寫(xiě)字符串的函數(shù)原型在stdio.h頭文件中,其函數(shù)形式為

char*fgets(char*str,intnum,FILE*stream)

fgets()函數(shù)從流文件stream中讀取至多num-1個(gè)字符,并把它們放入str指向的字符數(shù)組中。讀取字符直到遇見(jiàn)回車符或EOF(文件結(jié)束符)為止,或讀入了所限定的字符數(shù)。

intfputs(char*str,FILE*stream)

fputs()函數(shù)將str指向的字符串寫(xiě)入流文件。操作成功時(shí),函數(shù)返回0值,失敗返回非零值。

【例8-3】向磁盤(pán)寫(xiě)入字符串,并寫(xiě)入文本文件test.txt。

#include<stdio.h>

#include<string.h>

main()

{

FILE*fp;

charstr[128];

if((fp=fopen("test.txt","w"))==NULL) /*打開(kāi)只寫(xiě)的文本文件*/

運(yùn)行該程序,從鍵盤(pán)輸入長(zhǎng)度不超過(guò)127個(gè)字符的字符串,寫(xiě)入文件。如串長(zhǎng)為0,即空串,程序結(jié)束。輸入:

Hello!

Howdoyoudo

Good-bye!

這里所輸入的空串,實(shí)際為一單獨(dú)的回車符,其原因是gets函數(shù)判斷串的結(jié)束是以回車作標(biāo)志的。

【例8-4】從一個(gè)文本文件test.txt中讀出字符串,再寫(xiě)入另一個(gè)文件test2.txt。

程序共操作兩個(gè)文件,需定義兩個(gè)文件變量指針。因此,在操作文件以前,應(yīng)將兩個(gè)文件以需要的工作方式同時(shí)打開(kāi)(不分先后),讀寫(xiě)完成后,再關(guān)閉文件。設(shè)計(jì)過(guò)程是在寫(xiě)入文件的同時(shí)將寫(xiě)入內(nèi)容顯示在屏幕上,故程序運(yùn)行結(jié)束后,應(yīng)看到增加了與原文件相同的文本文件并在屏幕上顯示文件內(nèi)容。

3.格式化的讀寫(xiě)

前面的程序設(shè)計(jì)中,我們介紹過(guò)利用scanf()和printf()函數(shù)從鍵盤(pán)格式化輸入及在顯示器上進(jìn)行格式化輸出。對(duì)文件的格式化讀寫(xiě)就是在上述函數(shù)的前面加一個(gè)字母f成為fscanf()和fprintf()。其函數(shù)調(diào)用方式如下:

intfscanf(FILE*stream,char*format,arg_list)

intfprintf(FILE*stream,char*format,arg_list)

其中,stream為流文件指針,其余兩個(gè)參數(shù)與scanf()和printf()的用法完全相同。

【例8-5】將一些格式化的數(shù)據(jù)寫(xiě)入文本文件,再?gòu)脑撐募幸愿袷交椒ㄗx出顯示到屏幕上,其格式化數(shù)據(jù)是兩個(gè)學(xué)生記錄,包括姓名、學(xué)號(hào)、兩科成績(jī)。

#include<stdio.h>

main()

{

FILE*fp;

inti;

structstu{

/*定義結(jié)構(gòu)體類型*/

該程序設(shè)計(jì)一個(gè)文件變量指針,兩次以不同方式打開(kāi)同一文件,寫(xiě)入和讀出格式化數(shù)據(jù)。有一點(diǎn)很重要,那就是用什么格式寫(xiě)入文件,就一定用什么格式從文件讀,否則,讀出的數(shù)據(jù)與格式控制符不一致,就造成數(shù)據(jù)出錯(cuò)。

上述程序運(yùn)行如下:

inputdata:

xiaowanj00187.598.4

xiaolij00299.589.6

outputfromfile:

xiaowanj00187.5098.40

xiaolij00299.5089.60

此程序所訪問(wèn)的文件也可以為二進(jìn)制文件,若打開(kāi)文件的方式為

if((fp=fopen("test.txt","wb"))==NULL)

{/*以二進(jìn)制只寫(xiě)方式打開(kāi)文件*/

printf("cannotopenfile");

exit(0);

}

其效果完全相同。

4.成塊讀寫(xiě)

前面介紹的幾種讀寫(xiě)文件的方法,對(duì)復(fù)雜的數(shù)據(jù)類型無(wú)法以整體形式向文件寫(xiě)入或從文件讀出。C語(yǔ)言提供了成塊的讀寫(xiě)方式來(lái)操作文件,使數(shù)組或結(jié)構(gòu)體等類型可以進(jìn)行一次性讀寫(xiě)。成塊讀寫(xiě)文件函數(shù)的調(diào)用形式為

intfread(void*buf,intsize,intcount,FILE*stream)

intfwrite(void*buf,intsize,intcount,FILE*stream)

fread()函數(shù)從stream指向的流文件讀取count(字段數(shù))個(gè)字段,每個(gè)字段為size(字段長(zhǎng)度)個(gè)字符長(zhǎng),并把它們放到buf(緩沖區(qū))指向的字符數(shù)組中。

Fread()函數(shù)返回實(shí)際已讀取的字段數(shù)。若函數(shù)調(diào)用時(shí)要求讀取的字段數(shù)超過(guò)文件存放的字段數(shù),則出錯(cuò)或已到文件尾,在實(shí)際操作時(shí)應(yīng)注意檢測(cè)。

fwrite()函數(shù)從buf(緩沖區(qū))指向的字符數(shù)組中,把count(字段數(shù))字段寫(xiě)到stream所指向的流中,每個(gè)字段為size個(gè)字符長(zhǎng),函數(shù)操作成功時(shí)返回所寫(xiě)字段數(shù)。

關(guān)于成塊的文件讀寫(xiě),在創(chuàng)建文件時(shí)只能以二進(jìn)制文件格式創(chuàng)建。

【例8-6】向磁盤(pán)寫(xiě)入格式化數(shù)據(jù),再?gòu)脑撐募x出顯示到屏幕。

程序運(yùn)行結(jié)果如下:

inputdata:

xiaowanj00187.598.4

xiaolij00299.589.6

outputfromfile:

xiaowanj00187.5098.40

xiaolij00299.5089.60

通常,如果輸入數(shù)據(jù)的格式較為復(fù)雜的話,可采取將各種格式的數(shù)據(jù)當(dāng)做字符串輸入,然后將字符串轉(zhuǎn)換為所需的格式。

C語(yǔ)言提供函數(shù):

intatoi(char*ptr)

floatatof(char*ptr)

longintatol(char*ptr)

它們分別將字符串轉(zhuǎn)換為整型、實(shí)型和長(zhǎng)整型。使用時(shí)請(qǐng)將其包含的頭文件math.h或stdlib.h寫(xiě)在程序的前面。

任務(wù)五文件定位和文件的隨機(jī)讀寫(xiě)

1.文件定位移動(dòng)文件內(nèi)部位置指針的函數(shù)主要有兩個(gè),即rewind函數(shù)和fseek函數(shù)。

rewind函數(shù)前面已多次使用過(guò),其調(diào)用形式為

rewind(文件指針);它的功能是把文件內(nèi)部的位置指針移到文件首。

下面主要介紹fseek函數(shù)。

fseek函數(shù)用來(lái)移動(dòng)文件內(nèi)部位置指針,其調(diào)用形式為

fseek(文件指針,位移量,起始點(diǎn))

其中,“文件指針”指向被移動(dòng)的文件;“位移量”表示移動(dòng)的字節(jié)數(shù),要求位移量是long型數(shù)據(jù),以便在文件長(zhǎng)度大于64?KB時(shí)不會(huì)出錯(cuò),當(dāng)用常量表示位移量時(shí),要求加后綴“L”;“起始點(diǎn)”表示從何處開(kāi)始計(jì)算位移量,規(guī)定的起始點(diǎn)有3種:文件首、當(dāng)前位置和文件末尾。起始點(diǎn)的表示方法如表8.2所示。

例如,

fseek(fp,100L,0);

其意義是把位置指針移到離文件首100個(gè)字節(jié)處。

還要說(shuō)明的是,fseek函數(shù)一般用于二進(jìn)制文件。在文本文件中由于要進(jìn)行轉(zhuǎn)換,故往往計(jì)算的位置會(huì)出現(xiàn)錯(cuò)誤。

2.文件的隨機(jī)讀寫(xiě)

在移動(dòng)位置指針之后,即可用前面介紹的任一種讀寫(xiě)函數(shù)進(jìn)行讀寫(xiě)。由于一般是讀寫(xiě)一個(gè)數(shù)據(jù)塊,因此常用fread和fwrite函數(shù)。

下面用例題來(lái)說(shuō)明文件的隨機(jī)讀寫(xiě)。

【例8-7】在學(xué)生文件stu_list中讀出第二個(gè)學(xué)生的數(shù)據(jù)。

文件stu_list已由程序建立,本程序用隨機(jī)讀出的方法讀出第二個(gè)學(xué)生的數(shù)據(jù)。程序中定義boy為stu類型變量,qq為指向boy的指針。以讀二進(jìn)制文件方式打開(kāi)文件,程序第22行移動(dòng)文件位置指針。其中的i值為1,表示從文件頭開(kāi)始,移動(dòng)一個(gè)stu類型的長(zhǎng)度,然后再讀出的數(shù)據(jù)即為第二個(gè)學(xué)生的數(shù)據(jù)。

任務(wù)六項(xiàng)目實(shí)現(xiàn)

本項(xiàng)目——計(jì)算電話費(fèi)的程序代碼如下:

思?考?與?練?習(xí)

一、選擇題

1.下列哪條語(yǔ)句執(zhí)行后,文件的讀/寫(xiě)指針不指向文件首?()。

A.rewind(fp); B.FILE*c;

C.filec; D.file*c;

2.下列語(yǔ)句中,將C定義為文件型指針的是()。

A.FILEc; B.FILE*c;

C.filec; D.file*c;

3.若有定義FILE*fp,則打開(kāi)與關(guān)閉文件的命令是()。

A.fopen(fp),fclose(fp);

B.fopen(fp,"w"),fclose(fp);

C.open(fp),close(fp);

D.open(fp,"W"),close(fp);

4.C語(yǔ)言中,組成數(shù)據(jù)文件的成分是()。

A.記錄 B.?dāng)?shù)據(jù)行

C.?dāng)?shù)據(jù)塊 D.字符(字節(jié))序列

5.若要打開(kāi)A盤(pán)中user子目錄下名為abc.txt的文本文件進(jìn)行讀、寫(xiě)操作,下面符合此要求的函數(shù)調(diào)用是()。

A.fopen("A:\user\abc.txt","r+") B.fopen("A:\user\abc

溫馨提示

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