




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2 周末巧安排 教學(xué)設(shè)計(jì)-2024-2025學(xué)年道德與法治二年級(jí)上冊(cè)統(tǒng)編版
- 經(jīng)營(yíng)權(quán)轉(zhuǎn)讓合同模板
- 合同樣本商業(yè)地產(chǎn)項(xiàng)目投資合作協(xié)議書
- 個(gè)人向公司借款合同簡(jiǎn)例
- 1-1《子路、曾皙、冉有、公西華侍坐》教學(xué)設(shè)計(jì)-2024-2025學(xué)年高一語(yǔ)文下學(xué)期同步教學(xué)設(shè)計(jì)(統(tǒng)編版必修下冊(cè))
- Module 3 Unit 9 Great cities of the world(教學(xué)設(shè)計(jì))-2023-2024學(xué)年滬教牛津版(深圳用)英語(yǔ)六年級(jí)上冊(cè)
- 25《慢性子裁縫和急性子顧客》(教學(xué)設(shè)計(jì))-2023-2024學(xué)年統(tǒng)編版語(yǔ)文三年級(jí)下冊(cè)
- 豬舍購(gòu)銷合同范本
- 沉降檢測(cè)合同范本
- 毛毛新車網(wǎng)合同范本
- 交通運(yùn)輸安全管理整套教學(xué)課件
- 水力壓裂技術(shù)詳解334頁(yè)(PPT 最新技術(shù))_ppt
- 布洛維:拓展個(gè)案法
- SolidWorksTopDown設(shè)計(jì)方法實(shí)際應(yīng)用
- 七年級(jí)歷史第5課--安史之亂與唐朝衰亡ppt課件
- 戶外LED顯示屏設(shè)計(jì)施工方案.docx
- 凈土資糧——信愿行(05)第三講安住在彌陀大愿之海
- 化工車間開(kāi)停車風(fēng)險(xiǎn)分析
- 市政小三線施工方案(共22頁(yè))
- 靜壓樁機(jī)、鉆孔灌注樁、沉槽機(jī)CAD圖形
- 易經(jīng)(拼音版)
評(píng)論
0/150
提交評(píng)論