7.2.6文件操作 - 文件操作-專題輔導(dǎo)課件_第1頁(yè)
7.2.6文件操作 - 文件操作-專題輔導(dǎo)課件_第2頁(yè)
7.2.6文件操作 - 文件操作-專題輔導(dǎo)課件_第3頁(yè)
7.2.6文件操作 - 文件操作-專題輔導(dǎo)課件_第4頁(yè)
7.2.6文件操作 - 文件操作-專題輔導(dǎo)課件_第5頁(yè)
已閱讀5頁(yè),還剩19頁(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)介

C程序設(shè)計(jì)專題輔導(dǎo)課

文件操作內(nèi)容提要:什么是文件如何操作文件文件應(yīng)用例子一、什么是文件為什么要文件數(shù)據(jù)如何長(zhǎng)久保存?數(shù)組、結(jié)構(gòu)、鏈表等是內(nèi)存數(shù)據(jù)存儲(chǔ)的方式,不能長(zhǎng)久保存;程序計(jì)算結(jié)果如何長(zhǎng)久保存?大規(guī)模輸入數(shù)據(jù)如何保存?如何輸入程序?不同程序之間如何交換數(shù)據(jù)?文件:保存在外存儲(chǔ)器上的一組數(shù)據(jù)的有序集合文件如何組織C語(yǔ)言中的文件是數(shù)據(jù)流操作系統(tǒng):負(fù)責(zé)文件的整體管理和數(shù)據(jù)的存取應(yīng)用程序:負(fù)責(zé)文件數(shù)據(jù)的解釋與使用字節(jié)

........字節(jié)字節(jié)字節(jié)字節(jié)字節(jié)文件的兩種數(shù)據(jù)形式:

ASCII碼(文本文件textstream)字符流

二進(jìn)制碼(二進(jìn)制文件binarystream)二進(jìn)制文件是直接把內(nèi)存數(shù)據(jù)以二進(jìn)制形式保存。例如,整數(shù)1234文本文件保存:49505152(4個(gè)字符)二進(jìn)制文件保存:04D2(1234的二進(jìn)制數(shù))

緩沖文件系統(tǒng)向磁盤輸出數(shù)據(jù):數(shù)據(jù)緩沖區(qū),裝滿緩沖區(qū)后(或文件關(guān)閉)磁盤文件。從磁盤讀入數(shù)據(jù):先一次性從磁盤文件將一批數(shù)據(jù)輸入到緩沖區(qū),然后再?gòu)木彌_區(qū)逐個(gè)讀入數(shù)據(jù)到變量。

數(shù)據(jù)

……緩沖器512字節(jié)……文件由操作系統(tǒng)自動(dòng)完成程序控制文件名內(nèi)存單元內(nèi)存單元用什么標(biāo)識(shí)二、如何操作文件所有文件操作都通過(guò)函數(shù)調(diào)用方式實(shí)現(xiàn)使用登記:通知操作系統(tǒng)(fopen/fclose)數(shù)據(jù)讀寫:具體讀寫操作(四對(duì)常用的讀寫函數(shù))訪問(wèn)定位:默認(rèn)方式是順序讀寫要跳躍讀寫需要應(yīng)用程序自己定位(fseek)狀態(tài)判斷:判別當(dāng)前文件讀寫的狀態(tài)打開(kāi)文件:操作系統(tǒng)為相應(yīng)文件建立緩沖區(qū)信息表FILE*fopen(文件名,打開(kāi)方式)關(guān)閉文件:釋放緩沖區(qū)資源fclose(文件指針)FILE:結(jié)構(gòu)類型用typedef

定義,stdio.htypedef

struct{short level; /*緩沖區(qū)使用量*/unsigned flags; /*文件狀態(tài)標(biāo)志*/char fd; /*文件描述符*/short bsize; /*緩沖區(qū)大小*/unsignedchar *buffer; /*文件緩沖區(qū)的首地址*/unsignedchar *curp; /*指向文件緩沖區(qū)的工作指針*/unsignedchar hold; /*其他信息*/unsigned istemp;short token;}FILE;使用登記文件打開(kāi)方式fp=fopen("f.txt","r")文件打開(kāi)方式參數(shù)表不同打開(kāi)方式,文件讀寫起始位置不同:文件頭:r/r+,w/w+文件尾:a/a+文件讀寫函數(shù)字符讀寫函數(shù):文本文件

字符,字符

文本文件charfgetc(FILE*fp)

int

fputc(charc,FILE*fp);字符串讀寫函數(shù):文本文件

字符串(字符數(shù)組),字符串

文本文件char*fgets(char*string,intn,FILE*fp);int

fputs(char*string,FILE*fo);格式化讀寫函數(shù):文本文件

不同類型變量,不同類型變量

文本文件int

fscanf(FILE*fp,char*format,…);int

fprintf(FILE*fp,char*format,…);二進(jìn)制讀寫函數(shù):二進(jìn)制文件

內(nèi)存(變量),內(nèi)存(變量)-->二進(jìn)制文件int

fread(char*buffer,intsize,intcount,FILE*fp);int

fwrite(char*buffer,intsize,intcount,FILE*fp)文件定位的函數(shù):fseek(FILE*fp,longoff,intstart);rewind(FILE*fp);ftell(FILE*fp);狀態(tài)檢測(cè):檢測(cè)文件結(jié)尾函數(shù)feof(FILE*fp)檢測(cè)文件讀寫出錯(cuò)函數(shù)ferror(FILE*fp);清除末尾標(biāo)志和出錯(cuò)標(biāo)志函數(shù)clearerr(FILE*fp);三、文件應(yīng)用例子例1已知函數(shù)原型voidprint(FILE*input,char*output);

其中:input為輸入流,output為輸出文件名問(wèn):將標(biāo)準(zhǔn)輸入流(stdin)內(nèi)容傳到文件”temp.txt”的語(yǔ)句是?print(stdin,“temp.txt”);例子2:將a.txt文件中的小寫字母轉(zhuǎn)大寫,存入b.txt中voidmain(){charc;FILE*f1,*f2;if((f1=fopen("a.txt","r"))==NULL){printf("Can'topena.txt");exit(0);}if((f2=fopen("b.txt","w"))==NULL){printf("Can'topenb.txt");exit(0);}

while((c=fgetc(f1))!=EOF) if(c>='a'&&c<='z')fputc(c+'A'-'a',f2);elsefputc(c,f2);fclose(f1);fclose(f2);}

while(!feof(f1)){c=fgetc(f1);if(c>='a'&&c<='z')fputc(c+'A'-'a',f2);elsefputc(c,f2);}例子3:分析程序輸出a.txt:one?two?1234?output?b.txt:one?two?1204?input?程序輸出為_(kāi)___voidmain(){intcount;charch1,ch2;FILE*f1,*f2; if((f1=fopen("a.txt","r"))==NULL){printf("Can'topena.txt");exit(0);}if((f2=fopen("b.txt","r"))==NULL){printf("Can'topenb.txt");exit(0);} count=0; while(!feof(f1)||!feof(f2)){ch1=fgetc(f1); ch2=fgetc(f2); if(ch1!=ch2){printf("%c#%c#",ch1,ch2);

printf("%d#",count); break; } if(ch1=='?')count++; } fclose(f1); fclose(f2);}3#0#2#文本文件in.txt包含下列三行數(shù)據(jù),ThisisademohelloworldCisfun在下面這個(gè)命令行程序find.c中,在運(yùn)行“find–nis”后程序的輸出為()voidmain(int

argc,char*argv[]){ charline[1000];int

lineno=0;FILE*fp; if((fp=fopen("in.txt","r"))==NULL){

printf("File

in.txtOpenError\n");exit(1); }

if(argc==2){ while(fgets(line,1000,fp)!=NULL) if(strstr(line,argv[1])!=NULL)printf("%s",line);}elseif(argc==3&&strcmp(argv[1],"-n")==0) while(fgets(line,1000,fp)!=NULL){

lineno++; if(strstr(line,argv[2])!=NULL)

printf("%d:%s",lineno,line);} }elseprintf("Usage:find[-n]pattern\n");}例子4:分析程序輸出1:Thisisademo3:Cisfun例子5:命令行參數(shù)方式比較兩個(gè)文本文件是否完全相同:progfile1file2。main(int

argc,char*argv[]){FILE*fp1,*fp2;charc1,c2;if(argc!=

(1)

){printf("Usage:progfile1file2\n");exit(0);}if((fp1=fopen(argv[1],"r"))==NULL||

(2)

){

printf("Cannotopenfiles\n");exit(0);}c1=fgetc(fp1);c2=fgetc(fp2);while(

(3)

&&c1==c2){c1=fgetc(fp1);c2=fgetc(fp2);}if(

(4)

)

printf("Thetwofilesaredifferent!\n");else

printf("Thetwofilesarethesame!\n");

(5)

fclose(fp2);return0;}(1)3(2)(fp2=fopen(argv[2],”r”))==NULL(3)c1!=EOF(4)c1!=c2(5)fclose(fp1);例6:從文本中讀入10個(gè)整數(shù),排序后輸出到二進(jìn)制文件程序基本結(jié)構(gòu)變量定義(含數(shù)組input,兩個(gè)文件指針)從文件中讀入數(shù)據(jù)

數(shù)組input(用fscanf)對(duì)數(shù)組排序(可設(shè)計(jì)為函數(shù))將input輸出到文件中(用fwrite)排序函數(shù)(插入排序算法)voidsort(int*list,intn){ int

i,j,next;

for(i=1;i<n;i++){ next=list[i];

for(j=i-1;j>=0&&next<list[j];j--) list[j+1]=list[j]; list[j+1]=next; }}例6:源程序#include<stdio.h>voidsort(int*list,intn){ int

i,j,next;

for(i=1;i<n;i++){ next=list[i];

for(j=i-1;j>=0&&next<list[j];j--)list[j+1]=list[j]; list[j+1]=next; }}main(){ intinput[10],i; FILE*fpin,*fpout; if((fpin=fopen("in.dat","r"))==NULL){

printf("Cannotopenfilein.dat\n");exit(-1); }

for(i=0;i<10;i++)/*循環(huán)讀,每次一個(gè)整數(shù)*/

fscanf(fpin,"%d",&input[i]);

sort(input,10); if((fpout=fopen("out.dat","wb"))==NULL){

printf("Cannotopenfilein\n");exit(-1); }

fwrite(input,sizeof(int),10,fpout);/*input數(shù)組一次性寫出去*/

fclose(fpin);fclose(fpout);}例6:進(jìn)一步思考1.如果不是要求讀入指定的整數(shù)個(gè)數(shù)(10個(gè)),而要求讀入文件中的所有整數(shù)(但不知個(gè)數(shù)),怎么辦?

2.如果對(duì)輸入/輸出文件類型有以下要求,程序有什么區(qū)別?

(1)從文本文件中輸入,輸出到文本文件

(2)從文本文件中輸入,輸出到二進(jìn)制文件

(3)從二進(jìn)制文件中輸入,輸出到文本文件

3.打開(kāi)輸出文件(二進(jìn)制)時(shí),用“wb”。用“w”行嗎?關(guān)于輸入整數(shù)個(gè)數(shù)的處理如果從文本文件中輸入指定數(shù)目的整數(shù):

for(i=0;i<10;i++)

fscanf(fpin,"%d",&input[i]);如果從文本文件中輸入不確定數(shù)目的所有整數(shù)

while(fscanf(fpin,"%d",&input[i++])==1);如果從二進(jìn)制文件中輸入指定數(shù)目的整數(shù)

fread(input,sizeof(int),10,fpin);如果從二進(jìn)制文件中輸入不確定數(shù)目的整數(shù)

溫馨提示

  • 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)論