版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 養(yǎng)雞廠衛(wèi)生管理制度
- 衛(wèi)生局防疫消殺制度
- 游泳池公共衛(wèi)生管理制度
- 衛(wèi)生類應(yīng)急管理制度
- 衛(wèi)生院廉政建設(shè)制度
- 環(huán)境衛(wèi)生分片區(qū)管理制度
- 酒店客房衛(wèi)生間管理制度
- 美容美發(fā)館衛(wèi)生管理制度
- 影劇院公共衛(wèi)生管理制度
- 衛(wèi)生院藥品調(diào)劑管理制度
- DB32/T 3392-2018灌溉水系數(shù)應(yīng)用技術(shù)規(guī)范
- 2025年福建省水利投資開(kāi)發(fā)集團(tuán)連城水務(wù)有限公司招聘筆試參考題庫(kù)含答案解析
- 股東清算解散協(xié)議書(shū)
- 產(chǎn)后腰背疼康復(fù)治療
- 2025年商業(yè)物業(yè)抵押貸款合同范本
- 2024用電信息采集系統(tǒng)技術(shù)規(guī)范第1部分:專變采集終端
- 浙江省杭州市2024年中考語(yǔ)文試卷(含答案)
- 四川省綿陽(yáng)市2020年中考數(shù)學(xué)試題(含解析)
- 期末達(dá)標(biāo)測(cè)試卷(試題)-2024-2025學(xué)年人教PEP版英語(yǔ)四年級(jí)上冊(cè)
- DLT 1563-2016 中壓配電網(wǎng)可靠性評(píng)估導(dǎo)則
- HJ 377-2019 化學(xué)需氧量(CODCr)水質(zhì)在線自動(dòng)監(jiān)測(cè)儀技術(shù)要求及檢測(cè)方法
評(píng)論
0/150
提交評(píng)論