項(xiàng)目八 學(xué)生成績文件管理ppt課件_第1頁
項(xiàng)目八 學(xué)生成績文件管理ppt課件_第2頁
項(xiàng)目八 學(xué)生成績文件管理ppt課件_第3頁
項(xiàng)目八 學(xué)生成績文件管理ppt課件_第4頁
項(xiàng)目八 學(xué)生成績文件管理ppt課件_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、工程八 學(xué)生成果文件管理 工程要求將一個(gè)班40個(gè)同窗的相關(guān)數(shù)據(jù),存入文件中,再從文件中讀出,并將此數(shù)據(jù)按照平均分?jǐn)?shù)從高到低進(jìn)展排序后輸出在屏幕上和另一文件中。工程分析要完成學(xué)生成果的文件管理,第一必需求了解文件的概念,然后學(xué)會(huì)文件的翻開與封鎖;第二必需會(huì)對(duì)文件進(jìn)展讀取與寫入。所以,將這一工程分成二個(gè)義務(wù)引見。義務(wù)一是將學(xué)生成果順序讀寫到文件中;義務(wù)二是學(xué)生成果隨機(jī)讀寫到文件中。義務(wù)1 將學(xué)生成果順序讀寫到文件中 一、問題情景1有一個(gè)班共40個(gè)同窗參與了一次數(shù)學(xué)考試,現(xiàn)要將這個(gè)班的同窗的成果存到文件中,便于以后的管理,請(qǐng)編一個(gè)程序?qū)崿F(xiàn)之。2在上題的根底上,再把存到文件中的數(shù)據(jù)讀出來,并將其輸出在

2、顯示器上。二、詳細(xì)實(shí)現(xiàn)#include stdio.hmain()int a10,i,b10;FILE *p; /*定義一個(gè)文件指針類型的變量*/p=fopen(“aaa.txt,“w); /*翻開一個(gè)文件用以寫入文本文件*/for(i=0;i10;i+)scanf(%d,&ai);/*將輸入的成果以5d的格式保管在文件aaa.txt中*/for(i=0;i10;i+)fprintf(p,%5d,ai);fclose(p); /封鎖文件p=fopen(“aaa.txt,“r); /*翻開一個(gè)文件用以讀入文本文件*/*將aaa.txt文件中的數(shù)據(jù)讀入到數(shù)組b中*/for(i=0;i10;i+)f

3、scanf(p,%d,&bi);/*輸出數(shù)組b*/for(i=0;i10;i+)printf(%3d,bi);fclose(p);1、文件的翻開與封鎖;2、文件的讀寫;三、相關(guān)知識(shí)(一)文件的翻開封鎖。1. 文件的概念所謂“文件是指記錄在外部介質(zhì)上的數(shù)據(jù)的有序集合。從文件的編碼方式來看,文件可分為ASCII碼文件和二進(jìn)制碼文件兩種。2. 文件類型指針FILE *指針變量標(biāo)識(shí)符;例如:FILE *p;習(xí)慣上籠統(tǒng)地把p稱為指向一個(gè)文件的指針。在進(jìn)展讀寫操作之前要先翻開文件,運(yùn)用終了要封鎖文件。3. 文件的翻開與封鎖1文件的翻開fopen()函數(shù)fopen()函數(shù)用來翻開一個(gè)文件,其調(diào)用的普通方式為

4、:FILE *pp=fopen(文件名,運(yùn)用文件方式)2文件的封鎖fclose函數(shù)fclose(文件指針) 例如: fclose(p);FILE *pp=fopen(“aa.dat,r) FILE *fpfp=fopen(“d:a1.dat,rb);FILE *fp;if (fp=fopen(“d:aa.dat,r)=NULL)printf(“n cant open file!);exit(1)(二) 文件的讀寫(二) 文件的讀寫fprintf()函數(shù)和fscanf()函數(shù)調(diào)用格式:fscanf(文件指針,格式字符串,輸入表列)fprintf(文件指針,格式字符串,輸出表列)例如: fscan

5、tf(p,%d,%f,&a,&b); fprintf(p,%d,%f,a,b);#include stdio.hmain()int a10,i,b10;FILE *p; p=fopen(aaa.txt,w); for(i=0;i10;i+)scanf(%d,&ai);/*將輸入的成果以5d的格式保管在文件aaa.txt中*/for(i=0;i10;i+)fprintf(p,%5d,ai);fclose(p); /封鎖文件p=fopen(aaa.txt,r); /*將aaa.txt文件中的數(shù)據(jù)讀入到數(shù)組b中*/for(i=0;i10;i+)fscanf(p,%d,&bi);/*輸出數(shù)組b*/fo

6、r(i=0;i10;i+)printf(%3d,bi);fclose(p);分析問題情景中的C程序 【例8-1】從鍵盤中輸入一個(gè)學(xué)生的姓名及數(shù)學(xué)、英語、語文三門課的成果,計(jì)算這個(gè)同窗的平均分,然后將此同窗的有關(guān)信息寫入到文件cc.txt中;再把cc.txt文件中的數(shù)據(jù)讀入并輸出。分析:1需求定義一個(gè)字符數(shù)組存放姓名,三個(gè)整型變量存放三門課的成果,一個(gè)實(shí)型變量用來存用平均分;2在鍵盤上讀入此同窗的姓名、三門課的成果,并計(jì)算平均分;3將姓名、三門課的成果、平均分寫入到以寫入方式翻開的文本文件cc.txt中,然后封鎖此文件;4將cc.txt 文件以只讀的方式翻開后,將此文件中的數(shù)據(jù)讀入到指定的變量中

7、;5在顯示器上輸出變量;#include stdio.h#include “process.h /*有exit()函數(shù),一切用此庫函數(shù)*/main()char name10,n110;int math,english,chinese,m1,e1,c1;float avg,a1; FILE *fp;/*以寫入的方式翻開文件cc.txt*/if(fp=fopen(cc.txt,w)=NULL)printf(打不開文件n);exit(1);printf(請(qǐng)輸入這個(gè)學(xué)生的數(shù)據(jù)n);/*輸入該同窗的姓名、成果并計(jì)算該同窗的平均分*/scanf(%s%d%d%d,name,&math,&english,&

8、chinese);avg=(math+english+chinese)/3.0;/*將此同窗的姓名、三門課成果、平均分寫入到文件aa.txt中*/fprintf(fp,%s %d %d %d %.1fn,name,math,english,chinese,avg);fclose(fp);/*以讀入的方式翻開文件cc.txt*/if(fp=fopen(cc.txt,r)=NULL)printf(打不開文件n);exit(1);/*將該同窗的姓名、三門課成果、平均分讀入到指定的變量中*/fscanf(fp,%s%d%d%d%f,n1,&m1,&e1,&c1,&a1);fclose(fp);/*在顯

9、示器上輸出數(shù)據(jù)*/printf(從文件中讀出的數(shù)據(jù)為:n);printf(%s %d %d %d %.1fn,n1,m1,e1,c1,a1);【例8-2】從鍵盤中輸入10個(gè)學(xué)生的姓名及數(shù)學(xué)、英語、語文三門課的成果,計(jì)算每個(gè)同窗的平均分,然后將此10個(gè)同窗的姓名、三門課的成果及平均分寫入到文本文件aa.txt中。分析:編寫此題的思緒是:1需求定義一個(gè)構(gòu)造體數(shù)組,用于存放10個(gè)同窗的姓名、三門課的成果及平均分;2在鍵盤上讀入10個(gè)同窗的姓名、三門課的成果,然后計(jì)算每個(gè)同窗的平均分;3將10個(gè)同窗的姓名、三門課的成果及平均分寫入到文本文件aa.txt中;程序如下:#include stdio.h#i

10、nclude process.h /*定義構(gòu)造體*/struct stuchar name10;int math,english,chinese;float avg;main()stu student10,*pp;FILE *fp;int i;pp=student;/*以寫入的方式翻開文件aa.txt*/if(fp=fopen(aa.txt,w)=NULL)printf(打不開文件n);exit(1);printf(請(qǐng)輸入十個(gè)學(xué)生的數(shù)據(jù)n);/*輸入十個(gè)同窗的姓名、成果并計(jì)算每個(gè)同窗的平均分*/for(i=0;iname,&pp-math,&pp-english,&pp-chinese);pp

11、-avg=(pp-math+pp-englist+pp-chinese)/3.0;pp=student;/*將十個(gè)同窗的姓名、三門課成果、平均分寫入到文件aa.txt中*/for(i=0;iname,pp-math,pp-english,pp-chinese,pp-avg);fclose(fp); /封鎖文件輸入的數(shù)據(jù)如下:翻開件aa.txt 【例8-3】將上例中的文本文件aa.txt數(shù)據(jù)讀出,并將讀出的數(shù)據(jù)輸出在顯示器上。分析:1定義一個(gè)構(gòu)造體數(shù)組,用以存放讀出的數(shù)據(jù);2以只讀的方式翻開文件文件aa.txt;3將文本文件aa.txt中的數(shù)據(jù)讀入到構(gòu)造體數(shù)組中;4在顯示器上輸出此數(shù)組;#inc

12、lude stdio.h#include “process.h /*有exit()函數(shù),一切用此庫函數(shù)*/*定義構(gòu)造體*/struct stuchar name10;int math,english,chinese;float avg;main()stu student10,*pp;int i;FILE *fp;/*以讀入的方式翻開文件aa.txt*/if(fp=fopen(aa.txt,r)=NULL)printf(打不開文件n);exit(1);pp=student;/*從文件中將十個(gè)同窗的姓名、三門課成果、平均分讀入到構(gòu)造體數(shù)組student中*/for(i=0;iname,&pp-ma

13、th,&pp-english,&pp-chinese,&pp-avg);fclose(fp);pp=student;/*輸出構(gòu)造體數(shù)組student*/printf(從文件aa.txt中讀出的數(shù)據(jù)為:n);for(i=0;iname,pp-math,pp-english,pp-chinese,pp-avg);fclose(fp);顯然,輸出的結(jié)果就是上例中的數(shù)據(jù)。2. fread()函數(shù)、fwrite()函數(shù) 將一組數(shù)據(jù),如一個(gè)數(shù)組元素,一個(gè)構(gòu)造變量的值等一次性讀寫,其輸入輸出函數(shù)是二進(jìn)制方式輸入輸出的函數(shù),在輸入輸出中不用進(jìn)展數(shù)據(jù)的轉(zhuǎn)換,輸入輸出速度相對(duì)較快。讀寫數(shù)據(jù)塊函數(shù)調(diào)用的普通方式為:

14、fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);闡明:buffer:對(duì)于fread()來說,指的是 讀入數(shù)據(jù)的存放地址; 對(duì)于fwrite來說,是要輸出數(shù)據(jù)的地址。size讀寫數(shù)據(jù)時(shí),每筆數(shù)據(jù)的大小count: 讀寫數(shù)據(jù)的筆數(shù)fp: 文件指針for(i=0;iname,&pp-math,&pp-englist,&pp-chinese,&pp-avg);fread(yy,sizeof(struct stu),10,fp);for(i=0;iname,pp-math,pp-englist,pp-chinese,pp-avg);fwr

15、ite(pp,sizeof(struct stu),10,fp);用fread()、fwrite()函數(shù)將【例8-2】【例8-3】合成后的程序如下 #include stdio.h#include process.hstruct stuchar name10;int math,englist,chinese;float avg;main()stu student10, ss10,*yy,*pp;FILE *fp;int i;pp=student;if(fp=fopen(aa.dat,wb)=NULL)printf(打不開文件n);exit(1);printf(請(qǐng)輸入十個(gè)學(xué)生的數(shù)據(jù)n);for(

16、i=0;iname,&pp-math,&pp-englist,&pp-chinese);pp-avg=(pp-math+pp-englist+pp-chinese)/3.0;pp=student;fwrite(pp,sizeof(struct stu),10,fp);/*封鎖文件*/fclose(fp);if(fp=fopen(aa.dat,rb)=NULL)printf(打不開文件n);exit(1);yy=ss;/*一次性讀入十個(gè)同窗的數(shù)據(jù)*/fread(yy,sizeof(struct stu),10,fp);/*在顯示器上顯示結(jié)果*/printf(文件讀出后的數(shù)據(jù)為:n);for(i=

17、0;iname,yy-math,yy-englist,yy-chinese,yy-avg);fclose(fp);student用來在鍵盤上讀入,ss用來在文件中讀入 以寫入的方式翻開二進(jìn)制文件aa.dat一次性寫入十個(gè)數(shù)據(jù)以讀入的方式翻開二進(jìn)制文件aa.dat一次性讀入十個(gè)數(shù)據(jù)3. feof()函數(shù)功能是檢測文件能否到文件尾,假設(shè)是文件尾,那么其值為真,假設(shè)不是文件尾,那么其值為假。調(diào)用的普通方式:feof(文件指針)【例8-4】翻開例8-2中建立的文件aa.txt,輸入姓名,在aa.txt文件中查找該學(xué)生,找到以后輸出該學(xué)生的一切數(shù)據(jù),假設(shè)文件中沒有輸入的姓名,給出相應(yīng)的提示信息。分析:1

18、要翻開文件aa.txt2輸入要查找的姓名3讀一條記錄,檢查此記錄中的姓名能否與要查找的姓名一致,假設(shè)一致,那么輸 出此記錄。 4假設(shè)不是文件尾,那么不斷反復(fù)35假設(shè)記錄全查遍,無此記錄,那么輸出相應(yīng)信息。#include stdio.h#include process.h#include string.hstruct stuchar name10;int math,english,chinese;float avg;main()stu student10,*pp,ss10,*yy;char nn10;FILE *fp;int i;i=0;fp=fopen(aa.txt,r);printf(請(qǐng)輸

19、入要查找的姓名:);gets(nn);while(!feof(fp)fscanf(fp,%s%d%d%d%f,,&studenti.math,&studenti.english,&studenti.chinese,&studenti.avg);if(strcmp(nn,)=0)printf(%s %d %d %d %.1fn,,studenti.math,studenti.english,studenti.chinese,studenti.avg);break;i+;if (i=10) printf(對(duì)不起,查無此人

20、!n); fclose(fp);義務(wù)2 將學(xué)生成果隨機(jī)讀寫到文件中 一、問題情景 從鍵盤中輸入一個(gè)班40個(gè)學(xué)生的姓名及數(shù)學(xué)、英語、語文三門課的成果,計(jì)算每個(gè)同窗的平均分,然后將此40個(gè)同窗的姓名、三門課的成果及平均分寫入到文本文件aa.txt中;再從文件中讀取第 2, 4,6,8,10 個(gè)學(xué)生的數(shù)據(jù)并輸出在顯示器上。分析:例8-2、例8-3中的文件讀入和寫入都是順序讀寫,而本義務(wù)中的問題是要求隨機(jī)讀寫,即按要求進(jìn)展讀寫。換句話說,就是人為的控制當(dāng)前文件指針的挪動(dòng),讓文件指針隨意指向我們想要指向的位置,而不是像以往那樣按物理順序逐個(gè)挪動(dòng),這就是所謂對(duì)文件的定位與隨機(jī)讀寫。二、詳細(xì)實(shí)現(xiàn)為了程序運(yùn)轉(zhuǎn)

21、方便,所以假設(shè)只需10個(gè)學(xué)生#include stdio.h#include process.hstruct stuchar name10;int math,englist,chinese;float avg;main()stu student10,*pp,ss10,*yy;FILE *fp;int i;pp=student;if(fp=fopen(aa.txt,wb+)=NULL)printf(打不開文件n);exit(1);printf(請(qǐng)輸入十個(gè)學(xué)生的數(shù)據(jù)n);for(i=0;iname,&pp-math,&pp-englist,&pp-chinese);pp-avg=(pp-math+

22、pp-englist+pp-chinese)/3.0;pp=student;fwrite(pp,sizeof(struct stu),10,fp);yy=ss;rewind(fp); /定位到文件頭for(i=1;iname,yy-math,yy-englist,yy-chinese,yy-avg);知識(shí)點(diǎn)是: 1、文件的定位; 2、文件的隨機(jī)讀寫;三、相關(guān)知識(shí)所謂隨機(jī)讀寫,是指讀完上一個(gè)字符(字節(jié))后,并不一定要讀寫其后續(xù)的字符(字節(jié)),而可以讀寫文件中恣意位置上所需求的字符(字節(jié))。指針指向文件開頭的函數(shù)rewind()函數(shù)調(diào)用的方式:rewind(文件指針) 功能:將文件指針重新挪動(dòng)到文

23、件開頭的位置 2. fseek()函數(shù)fseek(文件指針, 位移量, 起始點(diǎn));功能:用來挪動(dòng)文件內(nèi)部位置指針 位移量,可以為正數(shù)也可以為負(fù)數(shù),假設(shè)為正數(shù),指針向地址高的方向挪動(dòng),假設(shè)為負(fù)數(shù),指針向地址低的方向挪動(dòng),假設(shè)位移量為常數(shù),要求加后綴L;起始點(diǎn)必需是0,1,2中的一個(gè),分別代表以下三個(gè)符號(hào)常量 起始點(diǎn) 表示符號(hào) 含義 0 SEEK_SET 文件開場 1 SEEK_CUR 當(dāng)前文件指針位置 2 SEEK_END 文件末尾 fseek()函數(shù)普通用于二進(jìn)制文件,由于文本文件要發(fā)生字符轉(zhuǎn)換,計(jì)算位置時(shí)往往會(huì)發(fā)生混亂。fseek(fp, 100L, 0);其意義是把位置指針移到離文件首10

24、0個(gè)字節(jié)處。fseek(fp,20L,1);將位置指針移到離當(dāng)前位置20個(gè)字節(jié)的位置向地址高的方向挪動(dòng)。 fseek(fp,-20L,1);將位置指針移到離當(dāng)前位置20個(gè)字節(jié)的位置向地址低的方向挪動(dòng)。 fseek(fp,-30L,2);將位置指針移到間隔文件末尾30個(gè)字節(jié)的位置。【例8-5】有5個(gè)學(xué)生,每個(gè)學(xué)生有3門課的成果,從鍵盤上分別輸入每個(gè)學(xué)生的學(xué)號(hào)、姓名、和3門課的成果,保管到一個(gè)名為ddd.dat的二進(jìn)制文件中去,然后在ddd.dat文件中讀出第三個(gè)學(xué)生的數(shù)據(jù)。分析:編寫此題的思緒是:1需求定義一個(gè)構(gòu)造體數(shù)組,用于存放5個(gè)同窗的姓名、三門課的成果;2在鍵盤上讀入5個(gè)同窗的姓名、三門課

25、的成果5;3以讀寫的方式翻開二制文件ddd.dat,將5個(gè)同窗的姓名、三門課的成果寫入到文件中;4將ddd.dat文件位置指針移到文件首,然后挪動(dòng)文件位置指針,將它定位在第三條記錄上,將數(shù)據(jù)讀入并顯示在顯示器上;5封鎖文件;程序如下:#include stdio.h#include “process.h /*有exit()函數(shù),一切用此庫函數(shù)*/#define N 5 struct stuchar name10;int math,englist,chinese;main()stu studentN,*pp;FILE *fp;int i;pp=student;if(fp=fopen(ddd.da

26、t,wb+)=NULL) printf(打不開文件n);exit(1);printf(請(qǐng)輸入%d個(gè)學(xué)生的數(shù)據(jù)n,N);for(i=0;iname,&pp-math,&pp-englist,&pp-chinese);pp=student;fwrite(pp,sizeof(struct stu),5,fp);rewind(fp); fseek(fp,2*sizeof(struct stu),0); fread(pp,sizeof(struct stu),1,fp);printf(輸出的第三個(gè)同窗的信息為:n);printf(%s %d %d %d n,pp-name,pp-math,pp-englist,pp-chinese);fclose(fp);以讀寫的方式翻開文件將文件位置指針挪動(dòng)文件首 從文件頭開場,挪動(dòng)文件位置指針到第三位義務(wù)3 舉一反三【例8-6】從鍵盤上輸入10個(gè)整數(shù),分別以文本文件和二進(jìn)制文件方式存入磁盤。分析:要翻開二個(gè)文件,一個(gè)文件以文本文件方式存入磁盤,另一個(gè)文件以二進(jìn)制方式存入磁盤,分別用fprintf()函數(shù)和fwrite()函數(shù)寫入 程序如下:#include stdio.h#define N 10main() i

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論