C語言程序設(shè)計(jì)基礎(chǔ)(通識版 慕課版) 課件 第10章 文件讀寫和綜合應(yīng)用_第1頁
C語言程序設(shè)計(jì)基礎(chǔ)(通識版 慕課版) 課件 第10章 文件讀寫和綜合應(yīng)用_第2頁
C語言程序設(shè)計(jì)基礎(chǔ)(通識版 慕課版) 課件 第10章 文件讀寫和綜合應(yīng)用_第3頁
C語言程序設(shè)計(jì)基礎(chǔ)(通識版 慕課版) 課件 第10章 文件讀寫和綜合應(yīng)用_第4頁
C語言程序設(shè)計(jì)基礎(chǔ)(通識版 慕課版) 課件 第10章 文件讀寫和綜合應(yīng)用_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第10章文件讀寫和綜合應(yīng)用哈爾濱工業(yè)大學(xué)10.1文本文件和二進(jìn)制文件按數(shù)據(jù)的組織形式文本文件(Textfile)用字節(jié)表示字符的字符序列,存儲每個(gè)字符的ASCII碼按行劃分C程序的源代碼二進(jìn)制文件(Binaryfile)按照數(shù)據(jù)在內(nèi)存中的存儲形式(二進(jìn)制)存儲到文件可執(zhí)行的C程序整數(shù)123必須按照數(shù)據(jù)存入的類型和格式讀出,才能恢復(fù)其本來面貌10.2緩沖型和非緩沖型文件系統(tǒng)緩沖型文件系統(tǒng)系統(tǒng)自動(dòng)在內(nèi)存中為每個(gè)正在使用的文件開辟一個(gè)緩沖區(qū),讀寫文件時(shí),數(shù)據(jù)先送緩沖區(qū)再傳給C程序或外存利用文件指針標(biāo)識文件緩沖型文件系統(tǒng)中的文件操作,也稱高級文件操作高級文件操作函數(shù)是ANSIC定義的,具有跨平臺和可移植的能力非緩沖文件系統(tǒng)不自動(dòng)設(shè)置文件緩沖區(qū),緩沖區(qū)需由程序員自己設(shè)定沒有文件指針,使用稱為文件號的整數(shù)來標(biāo)識文件10.3文件的打開和關(guān)閉C程序中流的打開和關(guān)閉是通過文件指針實(shí)現(xiàn)的FILE結(jié)構(gòu)體指針類型FILE*fp;fp指向一個(gè)特定的磁盤文件

typedefstruct{ shortlevel;/*緩沖區(qū)滿或空的程度*/ unsignedflags;/*文件狀態(tài)標(biāo)志*/ charfd;/*文件描述符*/ unsignedcharhold;/*如無緩沖區(qū)不讀字符*/ shortbsize;/*緩沖區(qū)的大小*/ unsignedchar*buffer;/*數(shù)據(jù)緩沖區(qū)的位置*/ unsignedchar*curp;/*指針當(dāng)前的指向*/ unsignedistemp;/*臨時(shí)文件指示器*/ shorttoken;/*用于有效性檢查*/}FILE;/*在stdio.h文件中定義*/文件指針類型在stdio.h中定義10.3文件的打開和關(guān)閉10.3文件的打開和關(guān)閉格式:FILE*fopen(constchar*filename,constchar*mode);FILE*fp;fp=fopen("D:\\newproject\\test.txt","r");Windows用反斜杠\分割路徑UNIX用斜杠/如果打開失敗(文件損壞或不存在),返回值為NULL文件打開后一定要檢查是否打開成功

if(fp==NULL)

{

printf("Failuretoopentest.txt!\n");

exit(0);

}10.3文件的打開和關(guān)閉二進(jìn)制文件文本文件

r

只讀必須是已存在的文件

w

只寫無論該文件是否存在,都新建一個(gè)文件

a

追加向文本文件尾添加數(shù)據(jù),該文件必須已經(jīng)存在r+

讀寫打開一個(gè)已存在的文件,用于讀寫w+讀寫新建一個(gè)文件,可讀可寫a+

讀寫

向文件尾追加數(shù)據(jù),也可讀

rbwbabrb+wb+ab+用a打開文件,若文件不存在會新建,保留原文件內(nèi)容,在文件末尾添加若文件不存在,w新建一個(gè)文件,若文件存在,w將原文件內(nèi)容覆蓋若文件存在:r+不清空文件,w+則清空文件,文件存在時(shí)慎用w+若文件不存在:r+打開會失敗,w+則會新建一個(gè)文件10.3文件的打開和關(guān)閉文件用完一定要關(guān)閉否則,可能引起數(shù)據(jù)丟失甚至影響其他文件的打開多數(shù)情況下,系統(tǒng)會限制同時(shí)打開的文件總數(shù)格式:intfclose(FILE*fp);若成功執(zhí)行了關(guān)閉操作,返回值為0否則返回為非零值,表示關(guān)閉時(shí)有錯(cuò)誤10.4

標(biāo)準(zhǔn)輸入輸出重定向C語言中的標(biāo)準(zhǔn)流stdio.h提供了三種標(biāo)準(zhǔn)流是備用的,不能聲明、打開和關(guān)閉文件指針標(biāo)準(zhǔn)流stdinstdoutstderr標(biāo)準(zhǔn)輸入標(biāo)準(zhǔn)輸出標(biāo)準(zhǔn)錯(cuò)誤輸出默認(rèn)的含義鍵盤終端顯示器屏幕終端顯示器屏幕scanf(),getchar(),gets()等通過stdin獲得輸入printf(),putchar(),puts()等用stdout進(jìn)行輸出stdout和stderr在默認(rèn)情況下都指向屏幕,有何區(qū)別呢?輸出到stdout的內(nèi)容先保存到緩沖區(qū)而輸出到stderr的內(nèi)容則直接輸出到屏幕10.4標(biāo)準(zhǔn)輸入輸出重定向輸入重定向D:\>demo<infile.txt從文件中讀入數(shù)據(jù)自來水廠輸出重定向D:\>demo>outfile.txt向文件輸出數(shù)據(jù)格式化讀寫int

fscanf(FILE*fp,const

char*format,...);fscanf(fp,"%d,%6.2f",&i,&t);參數(shù)1:文件指針參數(shù)2:格式控制參數(shù)參數(shù)3:地址參數(shù)表列int

fprintf(FILE*fp,const

char*format,...);fprintf(fp,"%d,%6.2f",i,t);參數(shù)1:文件指針參數(shù)2:格式控制參數(shù)參數(shù)3:輸出參數(shù)表列10.5.1按格式讀寫文件10.5.1按格式讀寫文件【例10.1】奧運(yùn)獎(jiǎng)牌排行榜V3.0。修改例9.2程序,從input.txt文件中讀入原來需要從鍵盤輸入的數(shù)據(jù),將按國名字典序得到的奧運(yùn)獎(jiǎng)牌排行榜結(jié)果保存到output.txt文件中。#include<stdio.h>#include<stdlib.h>#include<string.h>#defineN150 //國名字符串個(gè)數(shù)#defineM20//字符串最大長度structcountry{charname[M];intmedals;};intmain(void){intn;structcountrycountries[N];ReadfromFile("input.txt",countries,&n);StructSort(countries,n);//按國名字典序排序

WritetoFile("output.txt",countries,n);return0;}10.5.1按格式讀寫文件【例10.1】奧運(yùn)獎(jiǎng)牌排行榜V3.0。修改例9.2程序,從input.txt文件中讀入原來需要從鍵盤輸入的數(shù)據(jù),將按國名字典序得到的奧運(yùn)獎(jiǎng)牌排行榜結(jié)果保存到output.txt文件中。//函數(shù)功能:從文件中讀取參賽的國家數(shù),以及各個(gè)國家的名字和獎(jiǎng)牌數(shù)voidReadfromFile(charfileName[],structcountryc[],int*n){FILE*fp;if((fp=fopen(fileName,"r"))==NULL){printf("Failuretoopen%s!\n",fileName);exit(0);}fscanf(fp,"%d",n);//從文件中讀出參賽國家數(shù)

for(inti=0;i<*n;i++)//參賽國家數(shù)保存在指針變量n指向的內(nèi)存

{fscanf(fp,"%s%d",c[i].name,&c[i].medals);}fclose(fp);}10.5.1按格式讀寫文件【例10.1】奧運(yùn)獎(jiǎng)牌排行榜V3.0。修改例9.2程序,從input.txt文件中讀入原來需要從鍵盤輸入的數(shù)據(jù),將按國名字典序得到的奧運(yùn)獎(jiǎng)牌排行榜結(jié)果保存到output.txt文件中。//函數(shù)功能:輸出n個(gè)國家的名字和獎(jiǎng)牌數(shù)到文件中voidWritetoFile(charfileName[],structcountryc[],intn){FILE*fp;if((fp=fopen(fileName,"w"))==NULL){printf("Failuretoopen%s!\n",fileName);exit(0);}fprintf(fp,"%d\n",n);//將參賽國家數(shù)寫入文件

for(inti=0;i<n;i++){fprintf(fp,"%s:%d\n",c[i].name,c[i].medals);}fclose(fp);}10.5.1按格式讀寫文件//函數(shù)功能:用二維字符數(shù)組做函數(shù)參數(shù),交換法實(shí)現(xiàn)按國名字典序排序voidStructSort(structcountryc[],intn){for(inti=0;i<n-1;i++){for(intj=i+1;j<n;j++){if(strcmp(c[j].name,c[i].name)<0)//字符串比較

{SwapStruct(&c[i],&c[j]);}}}}//函數(shù)功能:兩個(gè)structcountry類型的結(jié)構(gòu)體數(shù)據(jù)互換voidSwapStruct(structcountry*x,structcountry*y){structcountryt;t=*x;*x=*y;*y=t;}10.5.2按字符讀寫文件

按字符讀寫int

fgetc(FILE*fp);從fp讀出一個(gè)字符,將位置指針指向下一個(gè)字符若讀成功,則返回該字符若讀到文件尾或者讀取錯(cuò)誤,則返回EOFint

fputc(intc,FILE*fp);向fp輸出字符c若寫入錯(cuò)誤,則返回EOF,否則返回c10.5.2按字符讀寫文件

intputchar(intc);向標(biāo)準(zhǔn)輸出流stdout(默認(rèn)屏幕)寫一個(gè)字符intgetchar(void);從標(biāo)準(zhǔn)輸入流stdin(默認(rèn)鍵盤)讀入一個(gè)字符intputc(intc,FILE*fp);intfputc(intc,FILE*fp);向任意流fp寫一個(gè)字符intgetc(FILE*fp);intfgetc(FILE*fp);從任意流fp讀入一個(gè)字符fputc(c,stdout)相當(dāng)于putchar(c)fgetc(stdin)相當(dāng)于

getchar()#defineputchar(c)putc(c,stdout)#define

getchar(c)getc(stdin)EOF在stdio.h中定義為-110.5.3按字符串讀寫文件int

fputs(const

char*s,FILE*fp);將字符串s寫入fp所指的文件中與puts()相同的是:若出現(xiàn)寫入錯(cuò)誤,則返回EOF,否則返回一個(gè)非負(fù)數(shù)與puts()不同的是:它不會自動(dòng)添加換行符,除非字符串本身含有換行符int

puts(constchar*s);將字符串s寫入標(biāo)準(zhǔn)輸出流stdout,并在其后添加一個(gè)換行符10.5.3按字符串讀寫文件

按字符串(行)寫文件

int

fputs(const

char*s,FILE*fp);將字符串s寫入fp所指的文件中與puts()相同的是:若出現(xiàn)寫入錯(cuò)誤,則返回EOF,否則返回一個(gè)非負(fù)數(shù)與puts()不同的是:它不會自動(dòng)添加換行符,除非字符串本身含有換行符int

puts(constchar*s);將字符串s寫入標(biāo)準(zhǔn)輸出流stdout,并在其后添加一個(gè)換行符char

*fgets(char*s,intn,FILE*fp);從fp所指的文件中讀取字符串,最多讀n-1個(gè)字符當(dāng)讀到回車換行符、文件末尾,或讀滿n-1個(gè)字符時(shí),函數(shù)返回該字符串的首地址用fgets(buf,sizeof(buf),stdin)代替gets(buf)更安全

char

*gets(char*s);從標(biāo)準(zhǔn)輸入流stdin讀取字符串,讀到換行符時(shí)停止相同點(diǎn)都會在字符串末尾添加'\0'讀取失敗或者到達(dá)文件尾都返回NULL不同點(diǎn)對換行符的處理不同gets不保留'\n'替換為'\0'fgets保留并存儲'\n',然后再添加'\0'10.5.3按字符串讀寫文件

10.6.1幸運(yùn)大抽獎(jiǎng)【例10.2】幸運(yùn)大抽獎(jiǎng)。從文件中讀取抽獎(jiǎng)?wù)叩拿趾褪謾C(jī)號信息,從鍵盤輸入獎(jiǎng)品數(shù)量n,然后循環(huán)向屏幕輸出抽獎(jiǎng)?wù)叩男畔ⅲ慈我怄I后清屏并停止循環(huán)輸出,僅輸出一位中獎(jiǎng)?wù)咝畔?,從抽?jiǎng)?wù)咧须S機(jī)抽取n個(gè)幸運(yùn)中獎(jiǎng)?wù)吆蠼Y(jié)束程序的運(yùn)行,要求已抽中的中獎(jiǎng)?wù)卟荒苤貜?fù)抽獎(jiǎng)。intmain(void){LUCKYmsg[NO];charfileName[SIZE];printf("請輸入保存抽獎(jiǎng)?wù)咝畔⒌奈募?");scanf("%s",fileName);inttotal=ReadFromFile(fileName,msg);printf("總計(jì)%d名參與抽獎(jiǎng)?wù)運(yùn)n",total);intprizesNum;do{printf("請輸入小于等于參與抽獎(jiǎng)人數(shù)的獎(jiǎng)品數(shù)量:");scanf("%d",&prizesNum);}while(prizesNum>total);system("pause");//凍結(jié)屏幕

PrizeDraw(msg,total,prizesNum);system("pause");return0;}#include<stdio.h>#include<string.h>#include<conio.h>#include<stdlib.h>#defineNO120#defineSIZE20typedefstruct{charname[SIZE];shortflag;}LUCKY;10.6.1幸運(yùn)大抽獎(jiǎng)【例10.2】幸運(yùn)大抽獎(jiǎng)。從文件中讀取抽獎(jiǎng)?wù)叩拿趾褪謾C(jī)號信息,從鍵盤輸入獎(jiǎng)品數(shù)量n,然后循環(huán)向屏幕輸出抽獎(jiǎng)?wù)叩男畔?,按任意鍵后清屏并停止循環(huán)輸出,僅輸出一位中獎(jiǎng)?wù)咝畔?,從抽?jiǎng)?wù)咧须S機(jī)抽取n個(gè)幸運(yùn)中獎(jiǎng)?wù)吆蠼Y(jié)束程序的運(yùn)行,要求已抽中的中獎(jiǎng)?wù)卟荒苤貜?fù)抽獎(jiǎng)。//函數(shù)功能:從文件讀出抽獎(jiǎng)?wù)咝畔ⅲ⒎祷貐⑴c抽獎(jiǎng)的人數(shù)intReadFromFile(charfileName[],LUCKYmsg[]){FILE*fp=fopen(fileName,"r");if(fp==NULL){printf("cannotopenfile%s\n",fileName);exit(0);}inti=0;while(fgets(msg[i].name,sizeof(msg[i].name),fp)){i++;}fclose(fp);returni;}10.6.1幸運(yùn)大抽獎(jiǎng)//函數(shù)功能:記錄抽獎(jiǎng)過程,并顯示中獎(jiǎng)?wù)咝畔oidPrizeDraw(LUCKYmsg[],inttotal,intprizesNum){for(inti=0;i<total;i++){msg[i].flag=0;//標(biāo)記都沒有被抽過

}inti=0,j=0;while(j!=prizesNum)//獎(jiǎng)品尚未抽完,則繼續(xù)循環(huán)

{intk=i%total;//確保循環(huán)顯示抽獎(jiǎng)?wù)咝畔?/p>

if(kbhit()&&msg[k].flag==0)//當(dāng)有按鍵,并且第k個(gè)人也沒有被抽過

{j++;//計(jì)數(shù)器記錄已中獎(jiǎng)人數(shù)

system("cls");//清屏

printf("第%d位中獎(jiǎng)?wù)?%s",j,msg[k].name);msg[k].flag=1;//標(biāo)記其已經(jīng)被抽過

system("pause");//等待用戶按任意鍵,以回車符結(jié)束輸入

}else{printf("%s",msg[k].name);//若沒有檢測到按鍵,則循環(huán)顯示抽獎(jiǎng)?wù)咝畔?/p>

}i++;}printf("抽獎(jiǎng)結(jié)束\n");}10.6.2人機(jī)交互走迷宮【例10.3】人機(jī)交互走迷宮。從文件讀出迷宮地圖,由用戶從鍵盤輸入迷宮的入口和出口位置坐標(biāo),從迷宮入口出發(fā),并從上、下、左、右四個(gè)方向選擇一個(gè)方向進(jìn)行試探,找到一條到達(dá)迷宮出口的通路。請編程,采用人機(jī)交互方式走迷宮。10.6.2人機(jī)交互走迷宮#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<windows.h>#defineN50//迷宮地圖的最大高度(行數(shù))#defineM50//迷宮地圖的寬度(列數(shù))typedefstructposition{intx;inty;}POS;intmap[N][M];//保存迷宮地圖inthigh;//迷宮地圖的行數(shù)(高度)intwidth;//迷宮地圖的列數(shù)(寬度)intmain(void){POSentry,exit;ReadMazeFile(map,&high,&width);//從文件中讀取迷宮地圖數(shù)據(jù)

ShowMaze(map,high,width);//顯示high行width列的迷宮

printf("Inputx1,y1,x2,y2:");scanf("%d,%d,%d,%d",&entry.x,&entry.y,&exit.x,&exit.y);//輸入起點(diǎn)和終點(diǎn)

map[entry.x][entry.y]=2;//游戲者的初始位置為(x,y)UpdateMaze(map,entry,exit);//與用戶輸入有關(guān)的更新

return0;}10.6.2人機(jī)交互走迷宮//函數(shù)功能:從maze.txt中讀取迷宮地圖數(shù)據(jù)voidReadMazeFile(intmap[][M],int*high,int*width){FILE*fp=fopen("maze.txt","r");if(fp==NULL){printf("cannotopenthefile\n");exit(0);}fscanf(fp,"%d%d",high,width);//先從文件中讀取迷宮地圖的行數(shù)和列數(shù)

for(inti=0;i<*high;i++){for(intj=0;j<*width;j++){fscanf(fp,"%d",&map[i][j]);}}fclose(fp);}10.6.2人機(jī)交互走迷宮//函數(shù)功能:顯示high行width列的迷宮地圖voidShowMaze(intmap[][M],inthigh,intwidth){for(inti=0;i<high;++i)//遍歷n行

{for(intj=0;j<width;++j)//遍歷m列

{if(map[i][j]==0){printf("");//顯示路

}elseif(map[i][j]==1){printf("■");//顯示墻

}elseif(map[i][j]==2){printf("★");//顯示游戲玩家走過的位置

}}printf("\n");}}10.6.2人機(jī)交互走迷宮//函數(shù)功能:更新迷宮地圖,若當(dāng)前位置已到達(dá)出口,則玩家贏voidUpdateMaze(intmap[][M],POScurrent,POSexit){charinput;while(current.x!=exit.

溫馨提示

  • 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

提交評論