




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
C程序設(shè)計專題輔導(dǎo)課
文件操作內(nèi)容提要:什么是文件如何操作文件文件應(yīng)用例子一、什么是文件為什么要文件數(shù)據(jù)如何長久保存?數(shù)組、結(jié)構(gòu)、鏈表等是內(nèi)存數(shù)據(jù)存儲的方式,不能長久保存;程序計算結(jié)果如何長久保存?大規(guī)模輸入數(shù)據(jù)如何保存?如何輸入程序?不同程序之間如何交換數(shù)據(jù)?文件:保存在外存儲器上的一組數(shù)據(jù)的有序集合文件如何組織C語言中的文件是數(shù)據(jù)流操作系統(tǒng):負責(zé)文件的整體管理和數(shù)據(jù)的存取應(yīng)用程序:負責(zé)文件數(shù)據(jù)的解釋與使用字節(jié)
........字節(jié)字節(jié)字節(jié)字節(jié)字節(jié)文件的兩種數(shù)據(jù)形式:
ASCII碼(文本文件textstream)字符流
二進制碼(二進制文件binarystream)二進制文件是直接把內(nèi)存數(shù)據(jù)以二進制形式保存。例如,整數(shù)1234文本文件保存:49505152(4個字符)二進制文件保存:04D2(1234的二進制數(shù))
緩沖文件系統(tǒng)向磁盤輸出數(shù)據(jù):數(shù)據(jù)緩沖區(qū),裝滿緩沖區(qū)后(或文件關(guān)閉)磁盤文件。從磁盤讀入數(shù)據(jù):先一次性從磁盤文件將一批數(shù)據(jù)輸入到緩沖區(qū),然后再從緩沖區(qū)逐個讀入數(shù)據(jù)到變量。
數(shù)據(jù)
……緩沖器512字節(jié)……文件由操作系統(tǒng)自動完成程序控制文件名內(nèi)存單元內(nèi)存單元用什么標(biāo)識二、如何操作文件所有文件操作都通過函數(shù)調(diào)用方式實現(xiàn)使用登記:通知操作系統(tǒng)(fopen/fclose)數(shù)據(jù)讀寫:具體讀寫操作(四對常用的讀寫函數(shù))訪問定位:默認方式是順序讀寫要跳躍讀寫需要應(yīng)用程序自己定位(fseek)狀態(tài)判斷:判別當(dāng)前文件讀寫的狀態(tài)打開文件:操作系統(tǒng)為相應(yīng)文件建立緩沖區(qū)信息表FILE*fopen(文件名,打開方式)關(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;使用登記文件打開方式fp=fopen("f.txt","r")文件打開方式參數(shù)表不同打開方式,文件讀寫起始位置不同:文件頭: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,…);二進制讀寫函數(shù):二進制文件
內(nèi)存(變量),內(nèi)存(變量)-->二進制文件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)檢測:檢測文件結(jié)尾函數(shù)feof(FILE*fp)檢測文件讀寫出錯函數(shù)ferror(FILE*fp);清除末尾標(biāo)志和出錯標(biāo)志函數(shù)clearerr(FILE*fp);三、文件應(yīng)用例子例1已知函數(shù)原型voidprint(FILE*input,char*output);
其中:input為輸入流,output為輸出文件名問:將標(biāo)準(zhǔn)輸入流(stdin)內(nèi)容傳到文件”temp.txt”的語句是?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?程序輸出為____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在下面這個命令行程序find.c中,在運行“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ù)方式比較兩個文本文件是否完全相同: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個整數(shù),排序后輸出到二進制文件程序基本結(jié)構(gòu)變量定義(含數(shù)組input,兩個文件指針)從文件中讀入數(shù)據(jù)
數(shù)組input(用fscanf)對數(shù)組排序(可設(shè)計為函數(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)讀,每次一個整數(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:進一步思考1.如果不是要求讀入指定的整數(shù)個數(shù)(10個),而要求讀入文件中的所有整數(shù)(但不知個數(shù)),怎么辦?
2.如果對輸入/輸出文件類型有以下要求,程序有什么區(qū)別?
(1)從文本文件中輸入,輸出到文本文件
(2)從文本文件中輸入,輸出到二進制文件
(3)從二進制文件中輸入,輸出到文本文件
3.打開輸出文件(二進制)時,用“wb”。用“w”行嗎?關(guān)于輸入整數(shù)個數(shù)的處理如果從文本文件中輸入指定數(shù)目的整數(shù):
for(i=0;i<10;i++)
fscanf(fpin,"%d",&input[i]);如果從文本文件中輸入不確定數(shù)目的所有整數(shù)
while(fscanf(fpin,"%d",&input[i++])==1);如果從二進制文件中輸入指定數(shù)目的整數(shù)
fread(input,sizeof(int),10,fpin);如果從二進制文件中輸入不確定數(shù)目的整數(shù)
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版心理咨詢師聘用合同
- 二零二五版貨物運輸保險合同條款
- 二零二五勞動合同中的危害告知
- 學(xué)校聘用教師合同書范例二零二五年
- 安全生產(chǎn)合同書協(xié)議書
- 運營管理環(huán)衛(wèi)服務(wù)項目合同二零二五年
- 招商引資合同擬稿和應(yīng)注意的事項二零二五年
- 大學(xué)生職業(yè)規(guī)劃大賽《烹飪與營養(yǎng)教育專業(yè)》生涯發(fā)展展示
- 大學(xué)生職業(yè)規(guī)劃大賽《輪機工程專業(yè)》生涯發(fā)展展示
- 2025規(guī)范城市商業(yè)租賃合同
- 廣東省深圳市福田區(qū)2023-2024學(xué)年六年級下學(xué)期英語期中試卷(含答案)
- 2023-2024學(xué)年廣東省廣州七中七年級(下)期中數(shù)學(xué)試卷(含答案)
- 2025年北京城市排水集團有限責(zé)任公司招聘筆試參考題庫含答案解析
- 課件-2025年春季學(xué)期 形勢與政策 第一講-加快建設(shè)社會主義文化強國
- 2025年山東惠民縣農(nóng)業(yè)投資發(fā)展限公司招聘10人歷年高頻重點提升(共500題)附帶答案詳解
- 大學(xué)美育知到智慧樹章節(jié)測試課后答案2024年秋長春工業(yè)大學(xué)
- 《基于嵌入式Linux的農(nóng)業(yè)信息采集系統(tǒng)設(shè)計與研究》
- 外科創(chuàng)傷處理-清創(chuàng)術(shù)(外科課件)
- 小型手推式除雪機畢業(yè)設(shè)計說明書(有全套CAD圖)
- 2024年中國酸奶袋市場調(diào)查研究報告
- 合同到期不續(xù)簽的模板
評論
0/150
提交評論