C語言程序設(shè)計(jì)基礎(chǔ)(微課版) 課件 第12章文件_第1頁
C語言程序設(shè)計(jì)基礎(chǔ)(微課版) 課件 第12章文件_第2頁
C語言程序設(shè)計(jì)基礎(chǔ)(微課版) 課件 第12章文件_第3頁
C語言程序設(shè)計(jì)基礎(chǔ)(微課版) 課件 第12章文件_第4頁
C語言程序設(shè)計(jì)基礎(chǔ)(微課版) 課件 第12章文件_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

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

文檔簡介

C語言程序設(shè)計(jì)

天津大學(xué)副教授張寧第12章文件文本文件與二進(jìn)制文件文件有多種類型,從文件編碼的方式看,可分為文本文件和二進(jìn)制文件兩種。也稱ASCII碼文件,每字符占一個(gè)字節(jié)存儲,每字節(jié)保存的是字符的ASCII碼??捎梦谋揪庉嬈魅缬浭卤镜瘸绦虼蜷_查看,例如文本文件(.txt)、C語言源程序文件(.c)、配置文件(.ini)等都屬文本文件。15678

00110001

00110101

00110110

00110111

00111000每字節(jié)對應(yīng)的十進(jìn)制(每字節(jié)均為ASCII碼)4953545556ASCII碼表示字符'1''5''6''7''8'文本文件文本文件與二進(jìn)制文件(2)以二進(jìn)制編碼的形式保存,例如可執(zhí)行文件(.exe)、位圖文件(.bmp)、word文件(.docx)等都屬二進(jìn)制文件。這種文件不能用文本編輯器如記事本等打開查看,如強(qiáng)行打開將得到“亂碼”,無法讀懂。優(yōu)點(diǎn):“全部看做二進(jìn)制”,輸入輸出的開始和結(jié)束由程序控制而不受換行、空格等字符的限制;比文本文件一般體積小,節(jié)省存儲空間。15678

00000000

00000000

00111101

00111110

每字節(jié)對應(yīng)的十進(jìn)制并不表示ASCII碼006162如強(qiáng)行當(dāng)做文本文件打開被當(dāng)做ASCII碼對應(yīng)字符為空白空白=>二進(jìn)制文件轉(zhuǎn)換為二進(jìn)制整體讀取轉(zhuǎn)換為十進(jìn)制亂碼!文本文件與二進(jìn)制文件(3)對不同類型的文件必須以正確的方式打開它,才能得到正確的結(jié)果:文本文件必須以文本文件的方式打開,二進(jìn)制文件也必須以二進(jìn)制的方式打開。文本文件或是二進(jìn)制文件的類型是由文件內(nèi)部的存儲方式?jīng)Q定的,與文件后綴名無關(guān)。例如同是.dat后綴的文件,既可以是文本文件,也可以是二進(jìn)制文件。但特定的文件必須具有正確的格式才能被正常使用。例如后綴為.exe的文件必須是二進(jìn)制的才能被執(zhí)行;當(dāng)然創(chuàng)建一個(gè)文本文件格式的exe文件也是可以創(chuàng)建的,文件可以存在,但是它無法被執(zhí)行不能正常使用。例如對一個(gè)圖片文件(.jpg)必須用圖片查看軟件以圖片的方式打開,如果用MP3播放器打開,當(dāng)然是不會聽到聲音的。因此打開方式十分重要,如果方式錯(cuò)亂,就得不到正確的結(jié)果。文件的讀寫文件操作步驟概述fp=fopen(文件名,打開方式);

第②步:打開文件(使文件指針關(guān)聯(lián)文件)fclose(fp);

第④步:關(guān)閉文件(斷開文件指針與文件的關(guān)聯(lián))第③步:讀寫文件第①步:定義文件指針FILE*fp;通過調(diào)用系統(tǒng)庫函數(shù)讀寫文件,函數(shù)中都需要一個(gè)文件指針參數(shù)fp

例1:向文件中寫入一個(gè)字符串#include<stdio.h>main(){ FILE*fp; fp=fopen("filea.txt","w"); fprintf(fp,"abc");

fclose(fp);}如此文件事先已經(jīng)存在,則會被刪除重建;如不存在,則直接重建,總之必然是重建新文件。以上程序的"abc"是寫到文件中的,程序運(yùn)行后在屏幕上不會有任何內(nèi)容輸出。文件打開方式(fopen函數(shù)的第2個(gè)參數(shù))r 允許讀文件(read):文件必須存在否則出錯(cuò)w 允許覆蓋寫文件(write):文件必須被新建(如文件已存在則會刪除原文件后新建)a 允許追加寫文件(append):文件不存在時(shí)才新建,否則只在原文件末尾添加數(shù)據(jù)+ 既允許讀也允許寫文件b 以二進(jìn)制格式打開文件(binary)t 以文本格式打開文件(text)在fopen函數(shù)的第二個(gè)參數(shù)中,就要說明兩件事:①是讀還是寫;②是文本格式、還是二進(jìn)制格式。這是通過一些字符的組合表示的:文件讀寫位置指針打開一個(gè)文件時(shí),讀寫位置指針一般指向文件的第一個(gè)字節(jié)。從文件讀數(shù)據(jù)時(shí),每讀一個(gè)字節(jié),指針就自動(dòng)向文件尾部移動(dòng)一個(gè)位置,指向下一個(gè)字節(jié);在向文件寫內(nèi)容時(shí),每寫入一個(gè)字節(jié),指針也自動(dòng)向文件尾部移動(dòng)一個(gè)位置,指向下一個(gè)寫入位置。abcd1234abcd1234

讀文件寫文件針對文件的讀寫操作,系統(tǒng)內(nèi)部有一個(gè)文件讀寫位置指針用來指示讀寫位置。C語言常用文本文件讀寫函數(shù)設(shè)fp為文件指針,已定義并已與文件關(guān)聯(lián)函數(shù)功能用法fgetc或getc從當(dāng)前位置指針處讀取文件中的一個(gè)字符(1個(gè)字符占1個(gè)字節(jié)),讀取后,讀寫位置指針自動(dòng)后移1字節(jié)字符變量=fgetc(fp);fputc或putc在當(dāng)前位置指針處向文件中寫入一個(gè)字符(1個(gè)字符占1個(gè)字節(jié)),寫入后,讀寫位置指針自動(dòng)后移1字節(jié)fputc(字符,fp);fgets讀取文件中的一個(gè)字符串,讀寫位置指針自動(dòng)后移fgets(字符數(shù)組名,n,fp);fputs在當(dāng)前位置指針處向文件中寫入一個(gè)字符串(不寫入'\0'字符,最后也不自動(dòng)加'\n');寫入后,位置指針自動(dòng)后移該字符串長度的字節(jié)。fputs(字符串首地址,fp);fscanf從當(dāng)前位置指針處按格式讀取文件中的多個(gè)數(shù)據(jù),類似于scanf,只不過不是從鍵盤輸入,而是從文件中讀取;讀取后,位置指針自動(dòng)后移fscanf(fp,"格式控制字符串",變量1的地址,變量2的地址,...);fprintf在當(dāng)前位置指針處按格式向文件中寫入多個(gè)數(shù)據(jù),類似于printf,只不過不是顯示到屏幕上,而是寫入到文件中;寫入后,位置指針自動(dòng)后移fprintf(fp,"格式控制字符串",數(shù)據(jù)1,數(shù)據(jù)2,...);例2:#include<stdio.h>#include<math.h>main(){ FILE*fp;inti,n;doublea,sum=0; fp=fopen("myfile.dat","w");/*以"w"打開文件,寫入數(shù)據(jù)*/

for(i=1;i<=5;i++) fprintf(fp,"%d%lf\n",i,log(i)); /*寫入一行*/ fclose(fp); /*寫入結(jié)束,關(guān)閉文件*/

fp=fopen("myfile.dat","r"); /*以"r"重新打開文件,讀取數(shù)據(jù)*/

for(i=1;i<=5;i++) { fscanf(fp,"%d%lf",&n,&a); /*讀取一行*/ sum+=a; } fclose(fp); /*讀取結(jié)束,關(guān)閉文件*/

printf("sum=%lf\n",sum); /*輸出總和到屏幕*/}將自然數(shù)1~5及它們的自然對數(shù)寫到文件myfile.dat中,然后從文件中讀出并計(jì)算它們的和,將和顯示到屏幕上。sum=4.787491C語言常用二進(jìn)制文件讀寫函數(shù)函數(shù)功能用法fread從當(dāng)前位置指針處讀取文件中的一批字節(jié),這批字節(jié)由count個(gè)數(shù)據(jù)塊、每數(shù)據(jù)塊長size個(gè)字節(jié)組成,共size*count個(gè)字節(jié)。所讀取的字節(jié)存入?yún)?shù)buffer地址開始的一段內(nèi)存空間。讀取后,文件位置指針跟隨后移實(shí)際讀取的字節(jié)數(shù)。函數(shù)返回實(shí)際讀取的數(shù)據(jù)塊數(shù)(如讀到文件尾或出錯(cuò),實(shí)際讀取的數(shù)據(jù)塊數(shù)可能小于count)fread(buffer,size,count,fp);fwrite在當(dāng)前位置指針處向文件中寫入一批字節(jié),這批字節(jié)位于內(nèi)存中參數(shù)buffer地址開始的一段內(nèi)存空間,由count個(gè)數(shù)據(jù)塊、每數(shù)據(jù)塊長size個(gè)字節(jié)組成,共size*count個(gè)字節(jié)。寫入后,文件位置指針跟隨后移實(shí)際寫入的字節(jié)數(shù)。函數(shù)返回實(shí)際寫入的數(shù)據(jù)塊數(shù)(如寫入出錯(cuò),實(shí)際寫入的數(shù)據(jù)塊數(shù)可能小于count)fwrite(buffer,size,count,fp);例3:二進(jìn)制讀寫文件#include<stdio.h>main(){ FILE*fp;

inta[3]={1,2,3},b[6],i; fp=fopen("c:\\f\\mydata.dat","wb");/*以"wb"打開文件,寫入數(shù)據(jù)*/

fwrite(a,sizeof(int),3,fp); /*寫入a數(shù)組的4*3字節(jié)*/

fwrite(a,sizeof(int),3,fp); /*再寫一遍a數(shù)組的4*3字節(jié)*/ fclose(fp); /*寫入結(jié)束,關(guān)閉文件*/ fp=fopen("c:\\f\\mydata.dat","rb");/*以"r"重新打開文件,讀取數(shù)據(jù)*/

fread(b,sizeof(int),6,fp); /*讀4*6個(gè)字節(jié),存入b數(shù)組*/ fclose(fp); /*讀取結(jié)束,關(guān)閉文件*/

for(i=0;i<6;i++)printf("%d",b[i]);/*輸出b數(shù)組到屏幕*/}123123C語言常用文件位置指針定位庫函數(shù)函數(shù)功能用法rewind把文件位置指針移到文件開頭rewind(fp);fseek把文件位置指針從ori開始的位置,向文件尾部(n>0時(shí))或文件首部(n<0時(shí))移動(dòng)n個(gè)字節(jié)。ori可有3種取值:0、1、2分別表示從文件首、當(dāng)前位置和文件尾開始移動(dòng),0、1、2也可分別寫為符號常量SEEK_SET、SEEK_CUR、SEEK_ENDfseek(fp,n,ori);一般n為long型,常量加字母后綴L(l)ftell若執(zhí)行成功,函數(shù)返回當(dāng)前文件位置指針的位置(文件中第一個(gè)字節(jié)的位置為0);若執(zhí)行失敗,函數(shù)返回-1n=ftell(fp);feof判斷讀文件是否已越過了文件末尾if(feof(fp))...文件的隨機(jī)讀寫FILE*fp=fopen("c:\\d1.dat","rb");fseek(fp,

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論