




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C程序設計專題輔導課
文件操作內容提要:什么是文件如何操作文件文件應用例子一、什么是文件為什么要文件數據如何長久保存?數組、結構、鏈表等是內存數據存儲的方式,不能長久保存;程序計算結果如何長久保存?大規模輸入數據如何保存?如何輸入程序?不同程序之間如何交換數據?文件:保存在外存儲器上的一組數據的有序集合文件如何組織C語言中的文件是數據流操作系統:負責文件的整體管理和數據的存取應用程序:負責文件數據的解釋與使用字節
........字節字節字節字節字節文件的兩種數據形式:
ASCII碼(文本文件textstream)字符流
二進制碼(二進制文件binarystream)二進制文件是直接把內存數據以二進制形式保存。例如,整數1234文本文件保存:49505152(4個字符)二進制文件保存:04D2(1234的二進制數)
緩沖文件系統向磁盤輸出數據:數據緩沖區,裝滿緩沖區后(或文件關閉)磁盤文件。從磁盤讀入數據:先一次性從磁盤文件將一批數據輸入到緩沖區,然后再從緩沖區逐個讀入數據到變量。
數據
……緩沖器512字節……文件由操作系統自動完成程序控制文件名內存單元內存單元用什么標識二、如何操作文件所有文件操作都通過函數調用方式實現使用登記:通知操作系統(fopen/fclose)數據讀寫:具體讀寫操作(四對常用的讀寫函數)訪問定位:默認方式是順序讀寫要跳躍讀寫需要應用程序自己定位(fseek)狀態判斷:判別當前文件讀寫的狀態打開文件:操作系統為相應文件建立緩沖區信息表FILE*fopen(文件名,打開方式)關閉文件:釋放緩沖區資源fclose(文件指針)FILE:結構類型用typedef
定義,stdio.htypedef
struct{short level; /*緩沖區使用量*/unsigned flags; /*文件狀態標志*/char fd; /*文件描述符*/short bsize; /*緩沖區大小*/unsignedchar *buffer; /*文件緩沖區的首地址*/unsignedchar *curp; /*指向文件緩沖區的工作指針*/unsignedchar hold; /*其他信息*/unsigned istemp;short token;}FILE;使用登記文件打開方式fp=fopen("f.txt","r")文件打開方式參數表不同打開方式,文件讀寫起始位置不同:文件頭:r/r+,w/w+文件尾:a/a+文件讀寫函數字符讀寫函數:文本文件
字符,字符
文本文件charfgetc(FILE*fp)
int
fputc(charc,FILE*fp);字符串讀寫函數:文本文件
字符串(字符數組),字符串
文本文件char*fgets(char*string,intn,FILE*fp);int
fputs(char*string,FILE*fo);格式化讀寫函數:文本文件
不同類型變量,不同類型變量
文本文件int
fscanf(FILE*fp,char*format,…);int
fprintf(FILE*fp,char*format,…);二進制讀寫函數:二進制文件
內存(變量),內存(變量)-->二進制文件int
fread(char*buffer,intsize,intcount,FILE*fp);int
fwrite(char*buffer,intsize,intcount,FILE*fp)文件定位的函數:fseek(FILE*fp,longoff,intstart);rewind(FILE*fp);ftell(FILE*fp);狀態檢測:檢測文件結尾函數feof(FILE*fp)檢測文件讀寫出錯函數ferror(FILE*fp);清除末尾標志和出錯標志函數clearerr(FILE*fp);三、文件應用例子例1已知函數原型voidprint(FILE*input,char*output);
其中:input為輸入流,output為輸出文件名問:將標準輸入流(stdin)內容傳到文件”temp.txt”的語句是?print(stdin,“temp.txt”);例子2:將a.txt文件中的小寫字母轉大寫,存入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包含下列三行數據,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:命令行參數方式比較兩個文本文件是否完全相同: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個整數,排序后輸出到二進制文件程序基本結構變量定義(含數組input,兩個文件指針)從文件中讀入數據
數組input(用fscanf)對數組排序(可設計為函數)將input輸出到文件中(用fwrite)排序函數(插入排序算法)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++)/*循環讀,每次一個整數*/
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數組一次性寫出去*/
fclose(fpin);fclose(fpout);}例6:進一步思考1.如果不是要求讀入指定的整數個數(10個),而要求讀入文件中的所有整數(但不知個數),怎么辦?
2.如果對輸入/輸出文件類型有以下要求,程序有什么區別?
(1)從文本文件中輸入,輸出到文本文件
(2)從文本文件中輸入,輸出到二進制文件
(3)從二進制文件中輸入,輸出到文本文件
3.打開輸出文件(二進制)時,用“wb”。用“w”行嗎?關于輸入整數個數的處理如果從文本文件中輸入指定數目的整數:
for(i=0;i<10;i++)
fscanf(fpin,"%d",&input[i]);如果從文本文件中輸入不確定數目的所有整數
while(fscanf(fpin,"%d",&input[i++])==1);如果從二進制文件中輸入指定數目的整數
fread(input,sizeof(int),10,fpin);如果從二進制文件中輸入不確定數目的整數
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年03月山東今日萊陽報社公開招聘新聞記者1人筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 2025年03月中國地質科學院水文地質環境地質研究所第一批公開招聘應屆畢業生15人(北京)筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 貴州省考試院2025年4月高三年級適應性考試地理試題及答案
- 柔印直接制版機項目安全評估報告
- 甘肅機電職業技術學院《漢語速錄》2023-2024學年第二學期期末試卷
- 溫州商學院《醫藥文獻檢索》2023-2024學年第二學期期末試卷
- 天津商務職業學院《第二外語(日、德)(2)》2023-2024學年第一學期期末試卷
- 沙洲職業工學院《幼兒語言教育與活動指導》2023-2024學年第二學期期末試卷
- 楚雄醫藥高等專科學校《專修健美操(2)》2023-2024學年第二學期期末試卷
- 西北大學現代學院《現場急救知識與技術》2023-2024學年第二學期期末試卷
- 經典知識產權培訓課件
- 十六年前的回憶閱讀及答案
- 煤礦電氣試驗規程
- 鋼筋混凝土排水管一級管配筋設計圖冊
- 新版藥品經營質量管理規范應知應會
- 初一下冊生物期中考試復習提綱
- APQP培訓-經典案例(完整版)
- 最全的L13J1建筑工程做法(共170頁)
- 鋼筋混凝土檢查井技術交底
- GH2-B組合型電氣火災監控探測器安裝使用說明書
- 單位公章使用登記表
評論
0/150
提交評論