版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
項(xiàng)目八文件——計(jì)算電話費(fèi)任務(wù)一了解文件任務(wù)二了解文件指針任務(wù)三文件的打開與關(guān)閉任務(wù)四文件的讀寫任務(wù)五文件定位和文件的隨機(jī)讀寫.任務(wù)六項(xiàng)目實(shí)現(xiàn)思考與練習(xí)
任務(wù)一了解文件
所謂“文件”是指一組相關(guān)數(shù)據(jù)的有序集合。這個數(shù)據(jù)集有一個名稱,叫做文件名。文件通常存儲在外部介質(zhì)(如磁盤等)上,在使用時才被調(diào)入內(nèi)存中。從不同的角度可對文件作不同的分類。
從用戶的角度看,文件可分為普通文件和設(shè)備文件兩種。普通文件是指存儲在磁盤或其他外部介質(zhì)上的一個有序數(shù)據(jù)集,可以是源文件、目標(biāo)文件、可執(zhí)行程序,也可以是一組待輸入處理的原始數(shù)據(jù),或者是一組輸出的結(jié)果。
設(shè)備文件是指與主機(jī)相連的各種外部設(shè)備,如顯示器、打印機(jī)、鍵盤等。在操作系統(tǒng)中,可以把外部設(shè)備也看作是一個文件來進(jìn)行管理,把對它們的輸入、輸出等同于對磁盤文件的讀和寫。
從文件編碼的方式來看,文件可分為ASCII文件和二進(jìn)制文件兩種。ASCII文件也稱為文本文件,這種文件在磁盤中存放時每個字符對應(yīng)一個字節(jié),用于存放對應(yīng)的ASCII字符。
例如,數(shù)字5678以ASCII字符的形式存儲占4個字節(jié),其存儲形式為
ASCII字符:00110101001101100011011100111000
↓
↓
↓
↓
十進(jìn)制字符:
5
6
7
8
ASCII文件可在屏幕上按字符顯示。例如,源程序文件就是ASCII文件,用DOS命令TYPE可顯示文件的內(nèi)容。由于是按字符顯示,因此能讀懂文件內(nèi)容。
二進(jìn)制文件是按二進(jìn)制的編碼方式來存放文件的。
例如,數(shù)字5678以二進(jìn)制的形式存儲只占兩個字節(jié),其存儲形式為
0001011000101110
二進(jìn)制文件雖然也可在屏幕上顯示,但其內(nèi)容無法讀懂。C語言系統(tǒng)在處理這些文件時,并不區(qū)分類型,都看成是字符流,按字節(jié)進(jìn)行處理。輸入輸出字符流的開始和結(jié)束只由程序控制而不受物理符號(如回車符)的控制,因此,也把這種文件稱作“流式
文件”。
任務(wù)二了解文件指針
在使用文件系統(tǒng)時,每一個文件被打開或創(chuàng)建之后,必須用文件類型指針作為該文件的文件標(biāo)識。在C語言編譯系統(tǒng)中都有文件結(jié)構(gòu)類型FILE的定義,在程序設(shè)計(jì)中可以直接用FILE定義文件類型指針變量。定義文件類型指針變量的一般形式為
FILE*文件指針變量名;
注意:FILE必須用大寫,且“*”不能省略。
例如,F(xiàn)ILE*fp;,其中,fp是一個指向FILE類型結(jié)構(gòu)的指針變量,通過文件指針變量能夠找到與它相關(guān)的文件。如果需要同時訪問n個文件,一般應(yīng)設(shè)n個指針變量(指向FILE類型結(jié)構(gòu)的指針變量),使它們分別指向n個文件(實(shí)際上是指向該文件的信息結(jié)構(gòu)),以實(shí)現(xiàn)對文件的訪問。當(dāng)然,同一指針變量通過對它進(jìn)行賦值也可以指向不同的文件。
任務(wù)三文件的打開與關(guān)閉
1.文件的打開(fopen函數(shù))
fopen函數(shù)用來打開一個文件,其調(diào)用的一般形式為文件指針名=fopen(文件名,使用文件方式);其中,“文件指針名”必須是被說明為FILE類型的指針變量;“文件名”是被打開文件的文件名;“使用文件方式”是指文件的類型和操作要求?!拔募笔亲址A炕蜃址?dāng)?shù)組。
例如,在本項(xiàng)目中需要打開文本文件“dial.txt”來讀取通話記錄。
FILE*fp;
fp=fopen("dial.txt","r");
其意義是在當(dāng)前目錄下打開文件“dial.txt”,只允許進(jìn)行“讀”操作,并使fp指向該文件。又如,
FILE*fphzk;
fphzk=fopen("c:\\hzk16","rb");
其意義是打開C驅(qū)動器磁盤根目錄下的文件hzk16,這是一個二進(jìn)制文件,只允許按二進(jìn)制方式進(jìn)行讀操作。兩個反斜線“\\”中的第一個表示轉(zhuǎn)義字符,第二個表示根目錄。
文件的使用方式共有12種,表8.1給出了它們的符號和意義。
對于文件使用方式有以下幾點(diǎn)說明:
(1)文件使用方式由r、w、a、t、b、+?6?個字符拼成,各字符的含義如下。
r(read): 讀
w(write): 寫
a(append): 追加
t(text): 文本文件,可省略不寫
b(banary): 二進(jìn)制文件
+:
讀和寫
(2)凡用“r”打開一個文件時,該文件必須已經(jīng)存在,且只能從該文件讀出。
(3)用“w”打開的文件只能向該文件寫入。若打開的文件不存在,則以指定的文件名建立該文件;若打開的文件已經(jīng)存在,則將該文件刪去,重建一個新文件。
(4)若要向一個已存在的文件追加新的信息,只能用“a”方式打開文件,但此時該文件必須是存在的,否則將會出錯。
(5)在打開一個文件時,如果出錯,fopen將返回一個空指針值NULL。在程序中可以用這一信息來判別是否完成打開文件的工作,并作相應(yīng)的處理。因此,常用以下程序段打開文件:
fp=fopen("dial.txt","r");
if(!fp)
{
printf("\nerroronopendial.txt!");
return-1;
}
這段程序的意義是:如果返回的指針為空,表示不能打開文件“dial.txt”,同時給出提示信息“erroronopendial.txt!”,退出程序。
(6)把一個文本文件讀入內(nèi)存時,要將ASCII字符轉(zhuǎn)換成二進(jìn)制字符;而把文件以文本方式寫入磁盤時,也要把二進(jìn)制字符轉(zhuǎn)換成ASCII字符,因此文本文件的讀寫要花費(fèi)較多的轉(zhuǎn)換時間。對二進(jìn)制文件的讀寫不存在這種轉(zhuǎn)換。
(7)標(biāo)準(zhǔn)輸入文件(鍵盤)、標(biāo)準(zhǔn)輸出文件(顯示器)、標(biāo)準(zhǔn)出錯輸出(出錯信息)是由系統(tǒng)打開的,可直接使用。
2.文件的關(guān)閉(fclose函數(shù))
文件一旦使用完畢,應(yīng)用關(guān)閉文件函數(shù)把文件關(guān)閉,以避免文件的數(shù)據(jù)丟失等錯誤。
fclose函數(shù)調(diào)用的一般形式為
fclose(文件指針);
例如,
fclose(fp);
正常完成關(guān)閉文件操作時,fclose函數(shù)的返回值為0。如返回非零值,則表示有錯誤發(fā)生。
任務(wù)四文件的讀寫
1.讀寫字符
C語言提供了fgetc和fputc函數(shù)對文本文件進(jìn)行字符的讀寫,其函數(shù)的原型存于stdio.h頭文件中,格式為
intfgetc(FILE*stream)
fgetc()函數(shù)從輸入流的當(dāng)前位置返回一個字符,并將文件指針指示器移到下一個字符處,如果已到文件結(jié)尾,函數(shù)返回EOF,此時表示本次操作結(jié)束。
若讀寫文件完成,則應(yīng)關(guān)閉文件。
intfputc(intch,FILE*stream)
fputc()函數(shù)完成將字符ch的值寫入所指定的流文件的當(dāng)前位置處,并將文件指針后移一位。fputc()函數(shù)的返回值是所寫入字符的值,出錯時返回EOF。
【例8-1】將存放于磁盤的指定文本文件按讀寫字符方式逐個地從文件讀出,然后再將其顯示到屏幕上。
運(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】從鍵盤輸入字符,存到磁盤文件test.txt中。
程序通過從鍵盤輸入一個以回車結(jié)束的字符串,寫入指定的流文件test.txt,文件以文本只寫方式打開,所以流文件具有可讀性,能支持各種字符處理工具訪問。
運(yùn)行程序:
Ilovechina!
2.讀寫字符串
C語言提供的讀寫字符串的函數(shù)原型在stdio.h頭文件中,其函數(shù)形式為
char*fgets(char*str,intnum,FILE*stream)
fgets()函數(shù)從流文件stream中讀取至多num-1個字符,并把它們放入str指向的字符數(shù)組中。讀取字符直到遇見回車符或EOF(文件結(jié)束符)為止,或讀入了所限定的字符數(shù)。
intfputs(char*str,FILE*stream)
fputs()函數(shù)將str指向的字符串寫入流文件。操作成功時,函數(shù)返回0值,失敗返回非零值。
【例8-3】向磁盤寫入字符串,并寫入文本文件test.txt。
#include<stdio.h>
#include<string.h>
main()
{
FILE*fp;
charstr[128];
if((fp=fopen("test.txt","w"))==NULL) /*打開只寫的文本文件*/
運(yùn)行該程序,從鍵盤輸入長度不超過127個字符的字符串,寫入文件。如串長為0,即空串,程序結(jié)束。輸入:
Hello!
Howdoyoudo
Good-bye!
這里所輸入的空串,實(shí)際為一單獨(dú)的回車符,其原因是gets函數(shù)判斷串的結(jié)束是以回車作標(biāo)志的。
【例8-4】從一個文本文件test.txt中讀出字符串,再寫入另一個文件test2.txt。
程序共操作兩個文件,需定義兩個文件變量指針。因此,在操作文件以前,應(yīng)將兩個文件以需要的工作方式同時打開(不分先后),讀寫完成后,再關(guān)閉文件。設(shè)計(jì)過程是在寫入文件的同時將寫入內(nèi)容顯示在屏幕上,故程序運(yùn)行結(jié)束后,應(yīng)看到增加了與原文件相同的文本文件并在屏幕上顯示文件內(nèi)容。
3.格式化的讀寫
前面的程序設(shè)計(jì)中,我們介紹過利用scanf()和printf()函數(shù)從鍵盤格式化輸入及在顯示器上進(jìn)行格式化輸出。對文件的格式化讀寫就是在上述函數(shù)的前面加一個字母f成為fscanf()和fprintf()。其函數(shù)調(diào)用方式如下:
intfscanf(FILE*stream,char*format,arg_list)
intfprintf(FILE*stream,char*format,arg_list)
其中,stream為流文件指針,其余兩個參數(shù)與scanf()和printf()的用法完全相同。
【例8-5】將一些格式化的數(shù)據(jù)寫入文本文件,再從該文件中以格式化方法讀出顯示到屏幕上,其格式化數(shù)據(jù)是兩個學(xué)生記錄,包括姓名、學(xué)號、兩科成績。
#include<stdio.h>
main()
{
FILE*fp;
inti;
structstu{
/*定義結(jié)構(gòu)體類型*/
該程序設(shè)計(jì)一個文件變量指針,兩次以不同方式打開同一文件,寫入和讀出格式化數(shù)據(jù)。有一點(diǎn)很重要,那就是用什么格式寫入文件,就一定用什么格式從文件讀,否則,讀出的數(shù)據(jù)與格式控制符不一致,就造成數(shù)據(jù)出錯。
上述程序運(yùn)行如下:
inputdata:
xiaowanj00187.598.4
xiaolij00299.589.6
outputfromfile:
xiaowanj00187.5098.40
xiaolij00299.5089.60
此程序所訪問的文件也可以為二進(jìn)制文件,若打開文件的方式為
if((fp=fopen("test.txt","wb"))==NULL)
{/*以二進(jìn)制只寫方式打開文件*/
printf("cannotopenfile");
exit(0);
}
其效果完全相同。
4.成塊讀寫
前面介紹的幾種讀寫文件的方法,對復(fù)雜的數(shù)據(jù)類型無法以整體形式向文件寫入或從文件讀出。C語言提供了成塊的讀寫方式來操作文件,使數(shù)組或結(jié)構(gòu)體等類型可以進(jìn)行一次性讀寫。成塊讀寫文件函數(shù)的調(diào)用形式為
intfread(void*buf,intsize,intcount,FILE*stream)
intfwrite(void*buf,intsize,intcount,FILE*stream)
fread()函數(shù)從stream指向的流文件讀取count(字段數(shù))個字段,每個字段為size(字段長度)個字符長,并把它們放到buf(緩沖區(qū))指向的字符數(shù)組中。
Fread()函數(shù)返回實(shí)際已讀取的字段數(shù)。若函數(shù)調(diào)用時要求讀取的字段數(shù)超過文件存放的字段數(shù),則出錯或已到文件尾,在實(shí)際操作時應(yīng)注意檢測。
fwrite()函數(shù)從buf(緩沖區(qū))指向的字符數(shù)組中,把count(字段數(shù))字段寫到stream所指向的流中,每個字段為size個字符長,函數(shù)操作成功時返回所寫字段數(shù)。
關(guān)于成塊的文件讀寫,在創(chuàng)建文件時只能以二進(jìn)制文件格式創(chuàng)建。
【例8-6】向磁盤寫入格式化數(shù)據(jù),再從該文件讀出顯示到屏幕。
程序運(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語言提供函數(shù):
intatoi(char*ptr)
floatatof(char*ptr)
longintatol(char*ptr)
它們分別將字符串轉(zhuǎn)換為整型、實(shí)型和長整型。使用時請將其包含的頭文件math.h或stdlib.h寫在程序的前面。
任務(wù)五文件定位和文件的隨機(jī)讀寫
1.文件定位移動文件內(nèi)部位置指針的函數(shù)主要有兩個,即rewind函數(shù)和fseek函數(shù)。
rewind函數(shù)前面已多次使用過,其調(diào)用形式為
rewind(文件指針);它的功能是把文件內(nèi)部的位置指針移到文件首。
下面主要介紹fseek函數(shù)。
fseek函數(shù)用來移動文件內(nèi)部位置指針,其調(diào)用形式為
fseek(文件指針,位移量,起始點(diǎn))
其中,“文件指針”指向被移動的文件;“位移量”表示移動的字節(jié)數(shù),要求位移量是long型數(shù)據(jù),以便在文件長度大于64?KB時不會出錯,當(dāng)用常量表示位移量時,要求加后綴“L”;“起始點(diǎn)”表示從何處開始計(jì)算位移量,規(guī)定的起始點(diǎn)有3種:文件首、當(dāng)前位置和文件末尾。起始點(diǎn)的表示方法如表8.2所示。
例如,
fseek(fp,100L,0);
其意義是把位置指針移到離文件首100個字節(jié)處。
還要說明的是,fseek函數(shù)一般用于二進(jìn)制文件。在文本文件中由于要進(jìn)行轉(zhuǎn)換,故往往計(jì)算的位置會出現(xiàn)錯誤。
2.文件的隨機(jī)讀寫
在移動位置指針之后,即可用前面介紹的任一種讀寫函數(shù)進(jìn)行讀寫。由于一般是讀寫一個數(shù)據(jù)塊,因此常用fread和fwrite函數(shù)。
下面用例題來說明文件的隨機(jī)讀寫。
【例8-7】在學(xué)生文件stu_list中讀出第二個學(xué)生的數(shù)據(jù)。
文件stu_list已由程序建立,本程序用隨機(jī)讀出的方法讀出第二個學(xué)生的數(shù)據(jù)。程序中定義boy為stu類型變量,qq為指向boy的指針。以讀二進(jìn)制文件方式打開文件,程序第22行移動文件位置指針。其中的i值為1,表示從文件頭開始,移動一個stu類型的長度,然后再讀出的數(shù)據(jù)即為第二個學(xué)生的數(shù)據(jù)。
任務(wù)六項(xiàng)目實(shí)現(xiàn)
本項(xiàng)目——計(jì)算電話費(fèi)的程序代碼如下:
思?考?與?練?習(xí)
一、選擇題
1.下列哪條語句執(zhí)行后,文件的讀/寫指針不指向文件首?()。
A.rewind(fp); B.FILE*c;
C.filec; D.file*c;
2.下列語句中,將C定義為文件型指針的是()。
A.FILEc; B.FILE*c;
C.filec; D.file*c;
3.若有定義FILE*fp,則打開與關(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語言中,組成數(shù)據(jù)文件的成分是()。
A.記錄 B.?dāng)?shù)據(jù)行
C.?dāng)?shù)據(jù)塊 D.字符(字節(jié))序列
5.若要打開A盤中user子目錄下名為abc.txt的文本文件進(jìn)行讀、寫操作,下面符合此要求的函數(shù)調(diào)用是()。
A.fopen("A:\user\abc.txt","r+") B.fopen("A:\user\abc
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度國際品牌營銷與廣告發(fā)布合同
- 2024版廠房租賃及產(chǎn)業(yè)升級改造服務(wù)合同3篇
- 2024年度鋼材物流配送及倉儲服務(wù)合同范本3篇
- 2024年度高科技項(xiàng)目融資擔(dān)保合同模板參考3篇
- 2024版夫妻共同生活及家庭財(cái)務(wù)管理合同6篇
- 2024版房產(chǎn)抵押貸款合同模板解析3篇
- 2024年度電力供應(yīng)合同標(biāo)的詳細(xì)描述協(xié)議書2篇
- 2024年度泵車租賃與跨區(qū)域運(yùn)營合同匯編3篇
- 2024版房產(chǎn)遠(yuǎn)期交易合同模板:帶押金退房條款3篇
- 2024版?zhèn)€人車輛按揭貸款合同3篇
- GB/T 9119-2010板式平焊鋼制管法蘭
- GB/T 25264-2010溶劑型丙烯酸樹脂涂料
- GB/T 14124-1993機(jī)械振動與沖擊對建筑物振動影響的測量和評價(jià)基本方法及使用導(dǎo)則
- GB/T 10325-2001定形耐火制品抽樣驗(yàn)收規(guī)則
- GB/T 10069.3-2008旋轉(zhuǎn)電機(jī)噪聲測定方法及限值第3部分:噪聲限值
- 《湯姆·索亞歷險(xiǎn)記》湯姆·索亞刷墻的精彩片段市賽獲獎
- 武漢大學(xué)2023年824法學(xué)基礎(chǔ)B考研真題(回憶版)
- 10000中國普通人名大全
- 危機(jī)傳播與管理課程教學(xué)大綱
- 新概念英語第二冊單詞表(打印版)
- 學(xué)生籃球考核標(biāo)準(zhǔn)
評論
0/150
提交評論