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

下載本文檔

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

文檔簡介

項(xiàng)目八學(xué)生成績文件管理

項(xiàng)目要求將一個班40個同學(xué)的相關(guān)數(shù)據(jù),存入文件中,再從文件中讀出,并將此數(shù)據(jù)按照平均分?jǐn)?shù)從高到低進(jìn)行排序后輸出在屏幕上和另一文件中。項(xiàng)目分析要完成學(xué)生成績的文件管理,第一必須要了解文件的概念,然后學(xué)會文件的打開與關(guān)閉;第二必須會對文件進(jìn)行讀取與寫入。所以,將這一項(xiàng)目分成二個任務(wù)介紹。任務(wù)一是將學(xué)生成績順序讀寫到文件中;任務(wù)二是學(xué)生成績隨機(jī)讀寫到文件中。項(xiàng)目八學(xué)生成績文件管理項(xiàng)目要求項(xiàng)目分析1任務(wù)1將學(xué)生成績順序讀寫到文件中

一、問題情景(1)有一個班共40個同學(xué)參加了一次數(shù)學(xué)考試,現(xiàn)要將這個班的同學(xué)的成績存到文件中,便于以后的管理,請編一個程序?qū)崿F(xiàn)之。(2)在上題的基礎(chǔ)上,再把存到文件中的數(shù)據(jù)讀出來,并將其輸出在顯示器上。二、具體實(shí)現(xiàn)#include"stdio.h"main(){inta[10],i,b[10];FILE*p;/*定義一個文件指針類型的變量*/p=fopen(“aaa.txt”,“w”);/*打開一個文件用以寫入文本文件*/for(i=0;i<10;i++)scanf("%d",&a[i]);/*將輸入的成績以5d的格式保存在文件aaa.txt中*/for(i=0;i<10;i++)fprintf(p,"%5d",a[i]);fclose(p);//關(guān)閉文件p=fopen(“aaa.txt”,“r”);/*打開一個文件用以讀入文本文件*//*將aaa.txt文件中的數(shù)據(jù)讀入到數(shù)組b中*/for(i=0;i<10;i++)fscanf(p,"%d",&b[i]);/*輸出數(shù)組b*/for(i=0;i<10;i++)printf("%3d",b[i]);fclose(p);}1、文件的打開與關(guān)閉;2、文件的讀寫;任務(wù)1將學(xué)生成績順序讀寫到文件中一、問題情景二、具體實(shí)現(xiàn)2三、相關(guān)知識(一)文件的打開關(guān)閉。1.文件的概念所謂“文件”是指記錄在外部介質(zhì)上的數(shù)據(jù)的有序集合。從文件的編碼方式來看,文件可分為ASCII碼文件和二進(jìn)制碼文件兩種。2.文件類型指針FILE*指針變量標(biāo)識符;例如:FILE*p;習(xí)慣上籠統(tǒng)地把p稱為指向一個文件的指針。在進(jìn)行讀寫操作之前要先打開文件,使用完畢要關(guān)閉文件。3.文件的打開與關(guān)閉(1)文件的打開(fopen()函數(shù))fopen()函數(shù)用來打開一個文件,其調(diào)用的一般形式為:FILE*pp=fopen(文件名,使用文件方式)(2)文件的關(guān)閉(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(“\ncan’topenfile!”);exit(1)}三、相關(guān)知識(一)文件的打開關(guān)閉。FILE*pFILE*3(二)文件的讀寫(二)文件的讀寫fprintf()函數(shù)和fscanf()函數(shù)調(diào)用格式:fscanf(文件指針,格式字符串,輸入表列)fprintf(文件指針,格式字符串,輸出表列)例如:fscantf(p,”%d,%f”,&a,&b);fprintf(p,”%d,%f”,a,b);#include"stdio.h"main(){inta[10],i,b[10];FILE*p;p=fopen("aaa.txt","w");

for(i=0;i<10;i++)scanf("%d",&a[i]);/*將輸入的成績以5d的格式保存在文件aaa.txt中*/for(i=0;i<10;i++)fprintf(p,"%5d",a[i]);fclose(p);//關(guān)閉文件p=fopen("aaa.txt","r");

/*將aaa.txt文件中的數(shù)據(jù)讀入到數(shù)組b中*/for(i=0;i<10;i++)fscanf(p,"%d",&b[i]);/*輸出數(shù)組b*/for(i=0;i<10;i++)printf("%3d",b[i]);fclose(p);}分析問題情景中的C程序(二)文件的讀寫(二)文件的讀寫例如:#include4【例8-1】從鍵盤中輸入一個學(xué)生的姓名及數(shù)學(xué)、英語、語文三門課的成績,計算這個同學(xué)的平均分,然后將此同學(xué)的有關(guān)信息寫入到文件cc.txt中;再把cc.txt文件中的數(shù)據(jù)讀入并輸出。分析:(1)需要定義一個字符數(shù)組存放姓名,三個整型變量存放三門課的成績,一個實(shí)型變量用來存用平均分;(2)在鍵盤上讀入此同學(xué)的姓名、三門課的成績,并計算平均分;(3)將姓名、三門課的成績、平均分寫入到以寫入形式打開的文本文件cc.txt中,然后關(guān)閉此文件;(4)將cc.txt文件以只讀的形式打開后,將此文件中的數(shù)據(jù)讀入到指定的變量中;(5)在顯示器上輸出變量;#include"stdio.h"#include“process.h”/*有exit()函數(shù),所有用此庫函數(shù)*/main(){charname[10],n1[10];intmath,english,chinese,m1,e1,c1;floatavg,a1;FILE*fp;/*以寫入的形式打開文件cc.txt*/if((fp=fopen("cc.txt","w"))==NULL){printf("打不開文件\n");exit(1);}printf("請輸入這個學(xué)生的數(shù)據(jù)\n");/*輸入該同學(xué)的姓名、成績并計算該同學(xué)的平均分*/scanf("%s%d%d%d",name,&math,&english,&chinese);avg=(math+english+chinese)/3.0;/*將此同學(xué)的姓名、三門課成績、平均分寫入到文件aa.txt中*/fprintf(fp,"%s%d%d%d%.1f\n",name,math,english,chinese,avg);fclose(fp);/*以讀入的形式打開文件cc.txt*/if((fp=fopen("cc.txt","r"))==NULL){printf("打不開文件\n");exit(1);}/*將該同學(xué)的姓名、三門課成績、平均分讀入到指定的變量中*/fscanf(fp,"%s%d%d%d%f",n1,&m1,&e1,&c1,&a1);fclose(fp);/*在顯示器上輸出數(shù)據(jù)*/printf("從文件中讀出的數(shù)據(jù)為:\n");printf("%s%d%d%d%.1f\n",n1,m1,e1,c1,a1);}【例8-1】從鍵盤中輸入一個學(xué)生的姓名及數(shù)學(xué)、英語、語文三門5【例8-2】從鍵盤中輸入10個學(xué)生的姓名及數(shù)學(xué)、英語、語文三門課的成績,計算每個同學(xué)的平均分,然后將此10個同學(xué)的姓名、三門課的成績及平均分寫入到文本文件aa.txt中。分析:編寫此題的思路是:(1)需要定義一個結(jié)構(gòu)體數(shù)組,用于存放10個同學(xué)的姓名、三門課的成績及平均分;(2)在鍵盤上讀入10個同學(xué)的姓名、三門課的成績,然后計算每個同學(xué)的平均分;(3)將10個同學(xué)的姓名、三門課的成績及平均分寫入到文本文件aa.txt中;程序如下:#include"stdio.h"#include"process.h"/*定義結(jié)構(gòu)體*/structstu{charname[10];intmath,english,chinese;floatavg;}main(){stustudent[10],*pp;FILE*fp;inti;pp=student;/*以寫入的形式打開文件aa.txt*/if((fp=fopen("aa.txt","w"))==NULL){printf("打不開文件\n");exit(1);}printf("請輸入十個學(xué)生的數(shù)據(jù)\n");/*輸入十個同學(xué)的姓名、成績并計算每個同學(xué)的平均分*/for(i=0;i<10;i++,pp++){scanf("%s%d%d%d",pp->name,&pp->math,&pp->english,&pp->chinese);pp->avg=(pp->math+pp->englist+pp->chinese)/3.0;}pp=student;/*將十個同學(xué)的姓名、三門課成績、平均分寫入到文件aa.txt中*/for(i=0;i<10;i++,pp++)fprintf(fp,"%s%d%d%d%.1f\n",pp->name,pp->math,pp->english,pp->chinese,pp->avg);fclose(fp);//關(guān)閉文件}輸入的數(shù)據(jù)如下:打開件aa.txt【例8-2】從鍵盤中輸入10個學(xué)生的姓名及數(shù)學(xué)、英語、語文三6【例8-3】將上例中的文本文件aa.txt數(shù)據(jù)讀出,并將讀出的數(shù)據(jù)輸出在顯示器上。分析:(1)定義一個結(jié)構(gòu)體數(shù)組,用以存放讀出的數(shù)據(jù);(2)以只讀的形式打開文件文件aa.txt;(3)將文本文件aa.txt中的數(shù)據(jù)讀入到結(jié)構(gòu)體數(shù)組中;(4)在顯示器上輸出此數(shù)組;#include"stdio.h"#include“process.h”/*有exit()函數(shù),所有用此庫函數(shù)*//*定義結(jié)構(gòu)體*/structstu{charname[10];intmath,english,chinese;floatavg;}main(){stustudent[10],*pp;inti;FILE*fp;/*以讀入的形式打開文件aa.txt*/if((fp=fopen("aa.txt","r"))==NULL){printf("打不開文件\n");exit(1);}pp=student;/*從文件中將十個同學(xué)的姓名、三門課成績、平均分讀入到結(jié)構(gòu)體數(shù)組student中*/for(i=0;i<10;i++,pp++)fscanf(fp,"%s%d%d%d%f",pp->name,&pp->math,&pp->english,&pp->chinese,&pp->avg);fclose(fp);pp=student;/*輸出結(jié)構(gòu)體數(shù)組student*/printf("從文件aa.txt中讀出的數(shù)據(jù)為:\n");for(i=0;i<10;i++,pp++)printf("%s%d%d%d%.1f\n",pp->name,pp->math,pp->english,pp->chinese,pp->avg);fclose(fp);}顯然,輸出的結(jié)果就是上例中的數(shù)據(jù)?!纠?-3】將上例中的文本文件aa.txt數(shù)據(jù)讀出,并將讀出72.fread()函數(shù)、fwrite()函數(shù)將一組數(shù)據(jù),如一個數(shù)組元素,一個結(jié)構(gòu)變量的值等一次性讀寫,其輸入輸出函數(shù)是二進(jìn)制形式輸入輸出的函數(shù),在輸入輸出中不必進(jìn)行數(shù)據(jù)的轉(zhuǎn)換,輸入輸出速度相對較快。讀寫數(shù)據(jù)塊函數(shù)調(diào)用的一般形式為:fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);說明:buffer:對于fread()來說,指的是讀入數(shù)據(jù)的存放地址;對于fwrite來說,是要輸出數(shù)據(jù)的地址。size讀寫數(shù)據(jù)時,每筆數(shù)據(jù)的大小count:讀寫數(shù)據(jù)的筆數(shù)fp:文件指針for(i=0;i<10;i++,pp++)fscanf(fp,"%s%d%d%d%f",pp->name,&pp->math,&pp->englist,&pp->chinese,&pp->avg);fread(yy,sizeof(structstu),10,fp);for(i=0;i<10;i++,p++)fprintf(fp,"%s%d%d%d%.1f\n",pp->name,pp->math,pp->englist,pp->chinese,pp->avg);fwrite(pp,sizeof(structstu),10,fp);2.fread()函數(shù)、fwrite()函數(shù)將8用fread()、fwrite()函數(shù)將【例8-2】【例8-3】合成后的程序如下

#include"stdio.h"#include"process.h"structstu{charname[10];intmath,englist,chinese;floatavg;}main(){stustudent[10],ss[10],*yy,*pp;FILE*fp;inti;pp=student;if((fp=fopen("aa.dat","wb"))==NULL){printf("打不開文件\n");exit(1);}printf("請輸入十個學(xué)生的數(shù)據(jù)\n");for(i=0;i<10;i++,pp++){scanf("%s%d%d%d",pp->name,&pp->math,&pp->englist,&pp->chinese);pp->avg=(pp->math+pp->englist+pp->chinese)/3.0;}pp=student;fwrite(pp,sizeof(structstu),10,fp);/*關(guān)閉文件*/fclose(fp);if((fp=fopen("aa.dat","rb"))==NULL){printf("打不開文件\n");exit(1);}yy=ss;/*一次性讀入十個同學(xué)的數(shù)據(jù)*/fread(yy,sizeof(structstu),10,fp);/*在顯示器上顯示結(jié)果*/printf("文件讀出后的數(shù)據(jù)為:\n");for(i=0;i<10;i++,yy++)printf("%s\t%5d%5d%5d%5.1f\n",yy->name,yy->math,yy->englist,yy->chinese,yy->avg);fclose(fp);}student用來在鍵盤上讀入,ss用來在文件中讀入以寫入的形式打開二進(jìn)制文件aa.dat一次性寫入十個數(shù)據(jù)以讀入的形式打開二進(jìn)制文件aa.dat一次性讀入十個數(shù)據(jù)用fread()、fwrite()函數(shù)將【例8-2】【例8-93.feof()函數(shù)功能是檢測文件是否到文件尾,若是文件尾,則其值為真,若不是文件尾,則其值為假。調(diào)用的一般形式:feof(文件指針)【例8-4】打開例8-2中建立的文件aa.txt,輸入姓名,在aa.txt文件中查找該學(xué)生,找到以后輸出該學(xué)生的所有數(shù)據(jù),如果文件中沒有輸入的姓名,給出相應(yīng)的提示信息。分析:(1)要打開文件aa.txt(2)輸入要查找的姓名(3)讀一條記錄,檢查此記錄中的姓名是否與要查找的姓名一致,若一致,則輸出此記錄。(4)如果不是文件尾,則一直重復(fù)(3)(5)如果記錄全查遍,無此記錄,則輸出相應(yīng)信息。3.feof()函數(shù)功能是檢測文件是否到文件尾,若是文件尾10#include"stdio.h"#include"process.h"#include"string.h"structstu{charname[10];intmath,english,chinese;floatavg;}main(){stustudent[10],*pp,ss[10],*yy;charnn[10];FILE*fp;inti;i=0;fp=fopen("aa.txt","r");printf("請輸入要查找的姓名:");gets(nn);while(!feof(fp)){fscanf(fp,"%s%d%d%d%f",student[i].name,&student[i].math,&student[i].english,&student[i].chinese,&student[i].avg);if(strcmp(nn,student[i].name)==0){printf("%s%d%d%d%.1f\n",student[i].name,student[i].math,student[i].english,student[i].chinese,student[i].avg);break;}i++;}if(i>=10)printf("對不起,查無此人!\n");fclose(fp);}#include"stdio.h"while(!feof(11任務(wù)2將學(xué)生成績隨機(jī)讀寫到文件中一、問題情景從鍵盤中輸入一個班40個學(xué)生的姓名及數(shù)學(xué)、英語、語文三門課的成績,計算每個同學(xué)的平均分,然后將此40個同學(xué)的姓名、三門課的成績及平均分寫入到文本文件aa.txt中;再從文件中讀取第2,4,6,8,10個學(xué)生的數(shù)據(jù)并輸出在顯示器上。分析:例8-2、例8-3中的文件讀入和寫入都是順序讀寫,而本任務(wù)中的問題是要求隨機(jī)讀寫,即按要求進(jìn)行讀寫。換句話說,就是人為的控制當(dāng)前文件指針的移動,讓文件指針隨意指向我們想要指向的位置,而不是像以往那樣按物理順序逐個移動,這就是所謂對文件的定位與隨機(jī)讀寫。任務(wù)2將學(xué)生成績隨機(jī)讀寫到文件中一、問題情景12二、具體實(shí)現(xiàn)(為了程序運(yùn)行方便,所以假設(shè)只有10個學(xué)生)#include"stdio.h"#include"process.h"structstu{charname[10];intmath,englist,chinese;floatavg;}main(){stustudent[10],*pp,ss[10],*yy;FILE*fp;inti;pp=student;if((fp=fopen("aa.txt","wb+"))==NULL){printf("打不開文件\n");exit(1);}printf("請輸入十個學(xué)生的數(shù)據(jù)\n");for(i=0;i<10;i++,pp++){scanf("%s%d%d%d",pp->name,&pp->math,&pp->englist,&pp->chinese);pp->avg=(pp->math+pp->englist+pp->chinese)/3.0;}pp=student;fwrite(pp,sizeof(structstu),10,fp);yy=ss;rewind(fp);//定位到文件頭for(i=1;i<10;i=i+2){fseek(fp,i*sizeof(structstu),0);

fread(yy,sizeof(structstu),1,fp);printf("%s\t%5d%5d%5d%5.1f\n",yy->name,yy->math,yy->englist,yy->chinese,yy->avg);}}知識點(diǎn)是:1、文件的定位;2、文件的隨機(jī)讀寫;二、具體實(shí)現(xiàn)(為了程序運(yùn)行方便,所以假設(shè)只有10個學(xué)生)#i13三、相關(guān)知識所謂隨機(jī)讀寫,是指讀完上一個字符(字節(jié))后,并不一定要讀寫其后續(xù)的字符(字節(jié)),而可以讀寫文件中任意位置上所需要的字符(字節(jié))。指針指向文件開頭的函數(shù)(rewind()函數(shù))調(diào)用的形式:rewind(文件指針)功能:將文件指針重新移動到文件開頭的位置2.fseek()函數(shù)fseek(文件指針,位移量,起始點(diǎn));功能:用來移動文件內(nèi)部位置指針位移量,可以為正數(shù)也可以為負(fù)數(shù),如果為正數(shù),指針向地址高的方向移動,如果為負(fù)數(shù),指針向地址低的方向移動,若位移量為常數(shù),要求加后綴L;起始點(diǎn)必須是0,1,2中的一個,分別代表以下三個符號常量起始點(diǎn)表示符號含義0SEEK_SET文件開始1SEEK_CUR當(dāng)前文件指針位置2SEEK_END文件末尾fseek()函數(shù)一般用于二進(jìn)制文件,因?yàn)槲谋疚募l(fā)生字符轉(zhuǎn)換,計算位置時往往會發(fā)生混亂。fseek(fp,100L,0);其意義是把位置指針移到離文件首100個字節(jié)處。fseek(fp,20L,1);將位置指針移到離當(dāng)前位置20個字節(jié)的位置(向地址高的方向移動)。fseek(fp,-20L,1);將位置指針移到離當(dāng)前位置20個字節(jié)的位置(向地址低的方向移動)。fseek(fp,-30L,2);將位置指針移到距離文件末尾30個字節(jié)的位置。三、相關(guān)知識所謂隨機(jī)讀寫,是指讀完上一個字符(字節(jié))后,并不14【例8-5】有5個學(xué)生,每個學(xué)生有3門課的成績,從鍵盤上分別輸入每個學(xué)生的學(xué)號、姓名、和3門課的成績,保存到一個名為ddd.dat的二進(jìn)制文件中去,然后在ddd.dat文件中讀出第三個學(xué)生的數(shù)據(jù)。分析:編寫此題的思路是:(1)需要定義一個結(jié)構(gòu)體數(shù)組,用于存放5個同學(xué)的姓名、三門課的成績;(2)在鍵盤上讀入5個同學(xué)的姓名、三門課的成績5;(3)以讀寫的形式打開二制文件ddd.dat,將5個同學(xué)的姓名、三門課的成績寫入到文件中;(4)將ddd.dat文件位置指針移到文件首,然后移動文件位置指針,將它定位在第三條記錄上,將數(shù)據(jù)讀入并顯示在顯示器上;(5)關(guān)閉文件;程序如下:#include"stdio.h"#include“process.h”/*有exit()函數(shù),所有用此庫函數(shù)*/#defineN5structstu{charname[10];intmath,englist,chinese;}main(){stustudent[N],*pp;FILE*fp;inti;pp=student;if((fp=fopen("ddd.dat","wb+"))==NULL){printf("打不開文件\n");exit(1);}printf("請輸入%d個學(xué)生的數(shù)據(jù)\n",N);for(i=0;i<N;i++,pp++)scanf("%s%d%d%d",pp->name,&pp->math,&pp->englist,&pp->chinese);pp=student;fwrite(pp,sizeof(structstu),5,fp);rewind(fp);

fseek(fp,2*sizeof(structstu),0);

fread(pp,sizeof(structstu),1,fp);printf("輸出的第三個同學(xué)的信息為:\n");printf("%s%d%d%d\n",pp->name,pp->math,pp->englist,pp->chinese);fclose(fp);}以讀寫的形式打開文件將文件位置指針移動文件首

從文件頭開始,移動文件位置指針到第三位【例8-5】有5個學(xué)生,每個學(xué)生有3門課的成績,從鍵盤上分別15任務(wù)3舉一反三【例8-6】從鍵盤上輸入10個整數(shù),分別以文本文件和二進(jìn)制文件方式存入磁盤。分析:要打開二個文件,一個文件以文本文件方式存入磁盤,另一個文件以二進(jìn)制方式存入磁盤,分別用fprintf()函數(shù)和fwrite()函數(shù)寫入程序如下:#include"stdio.h"#defineN10main(){intx[10],i,y[10];FILE*fp1,*fp2;fp1=fopen("d1.txt","w+");fp2=fopen("d2.dat","wb+");printf("請輸入%d個數(shù):\n",N);for(i=0;i<N;i++){scanf("%d",&x[i]);fprintf(fp1,"%5d",x[i]);}fwrite(x,sizeof(int),N,fp2);fclose(fp1);fclose(fp2);}將鍵盤中輸入的數(shù)寫入到文本文件d1.dat中;

一次性寫入數(shù)據(jù)到二進(jìn)制文件d2.dat中任務(wù)3舉一反三【例8-6】從鍵盤上輸入10個整數(shù),分別以16【例8-7】從上例中的文件d1.txt及d2.dat中讀出并顯示在顯示器上。分析:要打開二個文件,一個文件以文本文件方式讀入內(nèi)存,另一個文件以二進(jìn)制方式讀入內(nèi)存,分別用fscanf()函數(shù)和fread()函數(shù)讀入。程序如下:#include"stdio.h"#defineN10main(){intx[10],i,y[10];FILE*fp1,*fp2;fp1=fopen("d1.txt","r+");fp2=fopen("d2.dat","rb+");for(i=0;i<N;i++)fscanf(fp1,"%d",&y[i]);fread(x,sizeof(int),N,fp2);for(i=0;i<N;i++)printf("%5d",y[i]);printf("\n");for(i=0;i<N;i++)printf("%5d",x[i]);printf("\n");fclose(fp1);fclose(fp2);}將文件d1.txt讀入到數(shù)組y中將文件d2.dat讀入到數(shù)組x中【例8-7】從上例中的文件d1.txt及d2.dat中讀出并17【例8-8】將d2.dat中的1、3、5、7、9數(shù)據(jù)讀出并顯示在顯示器上#include"stdio.h"#defineN10main(){intx,i;FILE*fp2;fp2=fopen("d2.dat","rb+");for(i=0;i<N;i=i+2){fseek(fp2,i*sizeof(int),0);fread(&x,sizeof(int),1,fp2);printf("%5d",x);}printf("\n");fclose(fp2);}在文件中定位并將此數(shù)讀出,同時顯示在屏幕上【例8-8】將d2.dat中的1、3、5、7、9數(shù)據(jù)讀出并顯18項(xiàng)目八學(xué)生成績文件管理

項(xiàng)目要求將一個班40個同學(xué)的相關(guān)數(shù)據(jù),存入文件中,再從文件中讀出,并將此數(shù)據(jù)按照平均分?jǐn)?shù)從高到低進(jìn)行排序后輸出在屏幕上和另一文件中。項(xiàng)目分析要完成學(xué)生成績的文件管理,第一必須要了解文件的概念,然后學(xué)會文件的打開與關(guān)閉;第二必須會對文件進(jìn)行讀取與寫入。所以,將這一項(xiàng)目分成二個任務(wù)介紹。任務(wù)一是將學(xué)生成績順序讀寫到文件中;任務(wù)二是學(xué)生成績隨機(jī)讀寫到文件中。項(xiàng)目八學(xué)生成績文件管理項(xiàng)目要求項(xiàng)目分析19任務(wù)1將學(xué)生成績順序讀寫到文件中

一、問題情景(1)有一個班共40個同學(xué)參加了一次數(shù)學(xué)考試,現(xiàn)要將這個班的同學(xué)的成績存到文件中,便于以后的管理,請編一個程序?qū)崿F(xiàn)之。(2)在上題的基礎(chǔ)上,再把存到文件中的數(shù)據(jù)讀出來,并將其輸出在顯示器上。二、具體實(shí)現(xiàn)#include"stdio.h"main(){inta[10],i,b[10];FILE*p;/*定義一個文件指針類型的變量*/p=fopen(“aaa.txt”,“w”);/*打開一個文件用以寫入文本文件*/for(i=0;i<10;i++)scanf("%d",&a[i]);/*將輸入的成績以5d的格式保存在文件aaa.txt中*/for(i=0;i<10;i++)fprintf(p,"%5d",a[i]);fclose(p);//關(guān)閉文件p=fopen(“aaa.txt”,“r”);/*打開一個文件用以讀入文本文件*//*將aaa.txt文件中的數(shù)據(jù)讀入到數(shù)組b中*/for(i=0;i<10;i++)fscanf(p,"%d",&b[i]);/*輸出數(shù)組b*/for(i=0;i<10;i++)printf("%3d",b[i]);fclose(p);}1、文件的打開與關(guān)閉;2、文件的讀寫;任務(wù)1將學(xué)生成績順序讀寫到文件中一、問題情景二、具體實(shí)現(xiàn)20三、相關(guān)知識(一)文件的打開關(guān)閉。1.文件的概念所謂“文件”是指記錄在外部介質(zhì)上的數(shù)據(jù)的有序集合。從文件的編碼方式來看,文件可分為ASCII碼文件和二進(jìn)制碼文件兩種。2.文件類型指針FILE*指針變量標(biāo)識符;例如:FILE*p;習(xí)慣上籠統(tǒng)地把p稱為指向一個文件的指針。在進(jìn)行讀寫操作之前要先打開文件,使用完畢要關(guān)閉文件。3.文件的打開與關(guān)閉(1)文件的打開(fopen()函數(shù))fopen()函數(shù)用來打開一個文件,其調(diào)用的一般形式為:FILE*pp=fopen(文件名,使用文件方式)(2)文件的關(guān)閉(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(“\ncan’topenfile!”);exit(1)}三、相關(guān)知識(一)文件的打開關(guān)閉。FILE*pFILE*21(二)文件的讀寫(二)文件的讀寫fprintf()函數(shù)和fscanf()函數(shù)調(diào)用格式:fscanf(文件指針,格式字符串,輸入表列)fprintf(文件指針,格式字符串,輸出表列)例如:fscantf(p,”%d,%f”,&a,&b);fprintf(p,”%d,%f”,a,b);#include"stdio.h"main(){inta[10],i,b[10];FILE*p;p=fopen("aaa.txt","w");

for(i=0;i<10;i++)scanf("%d",&a[i]);/*將輸入的成績以5d的格式保存在文件aaa.txt中*/for(i=0;i<10;i++)fprintf(p,"%5d",a[i]);fclose(p);//關(guān)閉文件p=fopen("aaa.txt","r");

/*將aaa.txt文件中的數(shù)據(jù)讀入到數(shù)組b中*/for(i=0;i<10;i++)fscanf(p,"%d",&b[i]);/*輸出數(shù)組b*/for(i=0;i<10;i++)printf("%3d",b[i]);fclose(p);}分析問題情景中的C程序(二)文件的讀寫(二)文件的讀寫例如:#include22【例8-1】從鍵盤中輸入一個學(xué)生的姓名及數(shù)學(xué)、英語、語文三門課的成績,計算這個同學(xué)的平均分,然后將此同學(xué)的有關(guān)信息寫入到文件cc.txt中;再把cc.txt文件中的數(shù)據(jù)讀入并輸出。分析:(1)需要定義一個字符數(shù)組存放姓名,三個整型變量存放三門課的成績,一個實(shí)型變量用來存用平均分;(2)在鍵盤上讀入此同學(xué)的姓名、三門課的成績,并計算平均分;(3)將姓名、三門課的成績、平均分寫入到以寫入形式打開的文本文件cc.txt中,然后關(guān)閉此文件;(4)將cc.txt文件以只讀的形式打開后,將此文件中的數(shù)據(jù)讀入到指定的變量中;(5)在顯示器上輸出變量;#include"stdio.h"#include“process.h”/*有exit()函數(shù),所有用此庫函數(shù)*/main(){charname[10],n1[10];intmath,english,chinese,m1,e1,c1;floatavg,a1;FILE*fp;/*以寫入的形式打開文件cc.txt*/if((fp=fopen("cc.txt","w"))==NULL){printf("打不開文件\n");exit(1);}printf("請輸入這個學(xué)生的數(shù)據(jù)\n");/*輸入該同學(xué)的姓名、成績并計算該同學(xué)的平均分*/scanf("%s%d%d%d",name,&math,&english,&chinese);avg=(math+english+chinese)/3.0;/*將此同學(xué)的姓名、三門課成績、平均分寫入到文件aa.txt中*/fprintf(fp,"%s%d%d%d%.1f\n",name,math,english,chinese,avg);fclose(fp);/*以讀入的形式打開文件cc.txt*/if((fp=fopen("cc.txt","r"))==NULL){printf("打不開文件\n");exit(1);}/*將該同學(xué)的姓名、三門課成績、平均分讀入到指定的變量中*/fscanf(fp,"%s%d%d%d%f",n1,&m1,&e1,&c1,&a1);fclose(fp);/*在顯示器上輸出數(shù)據(jù)*/printf("從文件中讀出的數(shù)據(jù)為:\n");printf("%s%d%d%d%.1f\n",n1,m1,e1,c1,a1);}【例8-1】從鍵盤中輸入一個學(xué)生的姓名及數(shù)學(xué)、英語、語文三門23【例8-2】從鍵盤中輸入10個學(xué)生的姓名及數(shù)學(xué)、英語、語文三門課的成績,計算每個同學(xué)的平均分,然后將此10個同學(xué)的姓名、三門課的成績及平均分寫入到文本文件aa.txt中。分析:編寫此題的思路是:(1)需要定義一個結(jié)構(gòu)體數(shù)組,用于存放10個同學(xué)的姓名、三門課的成績及平均分;(2)在鍵盤上讀入10個同學(xué)的姓名、三門課的成績,然后計算每個同學(xué)的平均分;(3)將10個同學(xué)的姓名、三門課的成績及平均分寫入到文本文件aa.txt中;程序如下:#include"stdio.h"#include"process.h"/*定義結(jié)構(gòu)體*/structstu{charname[10];intmath,english,chinese;floatavg;}main(){stustudent[10],*pp;FILE*fp;inti;pp=student;/*以寫入的形式打開文件aa.txt*/if((fp=fopen("aa.txt","w"))==NULL){printf("打不開文件\n");exit(1);}printf("請輸入十個學(xué)生的數(shù)據(jù)\n");/*輸入十個同學(xué)的姓名、成績并計算每個同學(xué)的平均分*/for(i=0;i<10;i++,pp++){scanf("%s%d%d%d",pp->name,&pp->math,&pp->english,&pp->chinese);pp->avg=(pp->math+pp->englist+pp->chinese)/3.0;}pp=student;/*將十個同學(xué)的姓名、三門課成績、平均分寫入到文件aa.txt中*/for(i=0;i<10;i++,pp++)fprintf(fp,"%s%d%d%d%.1f\n",pp->name,pp->math,pp->english,pp->chinese,pp->avg);fclose(fp);//關(guān)閉文件}輸入的數(shù)據(jù)如下:打開件aa.txt【例8-2】從鍵盤中輸入10個學(xué)生的姓名及數(shù)學(xué)、英語、語文三24【例8-3】將上例中的文本文件aa.txt數(shù)據(jù)讀出,并將讀出的數(shù)據(jù)輸出在顯示器上。分析:(1)定義一個結(jié)構(gòu)體數(shù)組,用以存放讀出的數(shù)據(jù);(2)以只讀的形式打開文件文件aa.txt;(3)將文本文件aa.txt中的數(shù)據(jù)讀入到結(jié)構(gòu)體數(shù)組中;(4)在顯示器上輸出此數(shù)組;#include"stdio.h"#include“process.h”/*有exit()函數(shù),所有用此庫函數(shù)*//*定義結(jié)構(gòu)體*/structstu{charname[10];intmath,english,chinese;floatavg;}main(){stustudent[10],*pp;inti;FILE*fp;/*以讀入的形式打開文件aa.txt*/if((fp=fopen("aa.txt","r"))==NULL){printf("打不開文件\n");exit(1);}pp=student;/*從文件中將十個同學(xué)的姓名、三門課成績、平均分讀入到結(jié)構(gòu)體數(shù)組student中*/for(i=0;i<10;i++,pp++)fscanf(fp,"%s%d%d%d%f",pp->name,&pp->math,&pp->english,&pp->chinese,&pp->avg);fclose(fp);pp=student;/*輸出結(jié)構(gòu)體數(shù)組student*/printf("從文件aa.txt中讀出的數(shù)據(jù)為:\n");for(i=0;i<10;i++,pp++)printf("%s%d%d%d%.1f\n",pp->name,pp->math,pp->english,pp->chinese,pp->avg);fclose(fp);}顯然,輸出的結(jié)果就是上例中的數(shù)據(jù)?!纠?-3】將上例中的文本文件aa.txt數(shù)據(jù)讀出,并將讀出252.fread()函數(shù)、fwrite()函數(shù)將一組數(shù)據(jù),如一個數(shù)組元素,一個結(jié)構(gòu)變量的值等一次性讀寫,其輸入輸出函數(shù)是二進(jìn)制形式輸入輸出的函數(shù),在輸入輸出中不必進(jìn)行數(shù)據(jù)的轉(zhuǎn)換,輸入輸出速度相對較快。讀寫數(shù)據(jù)塊函數(shù)調(diào)用的一般形式為:fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);說明:buffer:對于fread()來說,指的是讀入數(shù)據(jù)的存放地址;對于fwrite來說,是要輸出數(shù)據(jù)的地址。size讀寫數(shù)據(jù)時,每筆數(shù)據(jù)的大小count:讀寫數(shù)據(jù)的筆數(shù)fp:文件指針for(i=0;i<10;i++,pp++)fscanf(fp,"%s%d%d%d%f",pp->name,&pp->math,&pp->englist,&pp->chinese,&pp->avg);fread(yy,sizeof(structstu),10,fp);for(i=0;i<10;i++,p++)fprintf(fp,"%s%d%d%d%.1f\n",pp->name,pp->math,pp->englist,pp->chinese,pp->avg);fwrite(pp,sizeof(structstu),10,fp);2.fread()函數(shù)、fwrite()函數(shù)將26用fread()、fwrite()函數(shù)將【例8-2】【例8-3】合成后的程序如下

#include"stdio.h"#include"process.h"structstu{charname[10];intmath,englist,chinese;floatavg;}main(){stustudent[10],ss[10],*yy,*pp;FILE*fp;inti;pp=student;if((fp=fopen("aa.dat","wb"))==NULL){printf("打不開文件\n");exit(1);}printf("請輸入十個學(xué)生的數(shù)據(jù)\n");for(i=0;i<10;i++,pp++){scanf("%s%d%d%d",pp->name,&pp->math,&pp->englist,&pp->chinese);pp->avg=(pp->math+pp->englist+pp->chinese)/3.0;}pp=student;fwrite(pp,sizeof(structstu),10,fp);/*關(guān)閉文件*/fclose(fp);if((fp=fopen("aa.dat","rb"))==NULL){printf("打不開文件\n");exit(1);}yy=ss;/*一次性讀入十個同學(xué)的數(shù)據(jù)*/fread(yy,sizeof(structstu),10,fp);/*在顯示器上顯示結(jié)果*/printf("文件讀出后的數(shù)據(jù)為:\n");for(i=0;i<10;i++,yy++)printf("%s\t%5d%5d%5d%5.1f\n",yy->name,yy->math,yy->englist,yy->chinese,yy->avg);fclose(fp);}student用來在鍵盤上讀入,ss用來在文件中讀入以寫入的形式打開二進(jìn)制文件aa.dat一次性寫入十個數(shù)據(jù)以讀入的形式打開二進(jìn)制文件aa.dat一次性讀入十個數(shù)據(jù)用fread()、fwrite()函數(shù)將【例8-2】【例8-273.feof()函數(shù)功能是檢測文件是否到文件尾,若是文件尾,則其值為真,若不是文件尾,則其值為假。調(diào)用的一般形式:feof(文件指針)【例8-4】打開例8-2中建立的文件aa.txt,輸入姓名,在aa.txt文件中查找該學(xué)生,找到以后輸出該學(xué)生的所有數(shù)據(jù),如果文件中沒有輸入的姓名,給出相應(yīng)的提示信息。分析:(1)要打開文件aa.txt(2)輸入要查找的姓名(3)讀一條記錄,檢查此記錄中的姓名是否與要查找的姓名一致,若一致,則輸出此記錄。(4)如果不是文件尾,則一直重復(fù)(3)(5)如果記錄全查遍,無此記錄,則輸出相應(yīng)信息。3.feof()函數(shù)功能是檢測文件是否到文件尾,若是文件尾28#include"stdio.h"#include"process.h"#include"string.h"structstu{charname[10];intmath,english,chinese;floatavg;}main(){stustudent[10],*pp,ss[10],*yy;charnn[10];FILE*fp;inti;i=0;fp=fopen("aa.txt","r");printf("請輸入要查找的姓名:");gets(nn);while(!feof(fp)){fscanf(fp,"%s%d%d%d%f",student[i].name,&student[i].math,&student[i].english,&student[i].chinese,&student[i].avg);if(strcmp(nn,student[i].name)==0){printf("%s%d%d%d%.1f\n",student[i].name,student[i].math,student[i].english,student[i].chinese,student[i].avg);break;}i++;}if(i>=10)printf("對不起,查無此人!\n");fclose(fp);}#include"stdio.h"while(!feof(29任務(wù)2將學(xué)生成績隨機(jī)讀寫到文件中一、問題情景從鍵盤中輸入一個班40個學(xué)生的姓名及數(shù)學(xué)、英語、語文三門課的成績,計算每個同學(xué)的平均分,然后將此40個同學(xué)的姓名、三門課的成績及平均分寫入到文本文件aa.txt中;再從文件中讀取第2,4,6,8,10個學(xué)生的數(shù)據(jù)并輸出在顯示器上。分析:例8-2、例8-3中的文件讀入和寫入都是順序讀寫,而本任務(wù)中的問題是要求隨機(jī)讀寫,即按要求進(jìn)行讀寫。換句話說,就是人為的控制當(dāng)前文件指針的移動,讓文件指針隨意指向我們想要指向的位置,而不是像以往那樣按物理順序逐個移動,這就是所謂對文件的定位與隨機(jī)讀寫。任務(wù)2將學(xué)生成績隨機(jī)讀寫到文件中一、問題情景30二、具體實(shí)現(xiàn)(為了程序運(yùn)行方便,所以假設(shè)只有10個學(xué)生)#include"stdio.h"#include"process.h"structstu{charname[10];intmath,englist,chinese;floatavg;}main(){stustudent[10],*pp,ss[10],*yy;FILE*fp;inti;pp=student;if((fp=fopen("aa.txt","wb+"))==NULL){printf("打不開文件\n");exit(1);}printf("請輸入十個學(xué)生的數(shù)據(jù)\n");for(i=0;i<10;i++,pp++){scanf("%s%d%d%d",pp->name,&pp->math,&pp->englist,&pp->chinese);pp->avg=(pp->math+pp->englist+pp->chinese)/3.0;}pp=student;fwrite(pp,sizeof(structstu),10,fp);yy=ss;rewind(fp);//定位到文件頭for(i=1;i<10;i=i+2){fseek(fp,i*sizeof(structstu),0);

fread(yy,sizeof(structstu),1,fp);printf("%s\t%5d%5d%5d%5.1f\n",yy->name,yy->math,yy->englist,yy->chinese,yy->avg);}}知識點(diǎn)是:1、文件的定位;2、文件的隨機(jī)讀寫;二、具體實(shí)現(xiàn)(為了程序運(yùn)行方便,所以假設(shè)只有10個學(xué)生)#i31三、相關(guān)知識所謂隨機(jī)讀寫,是指讀完上一個字符(字節(jié))后,并不一定要讀寫其后續(xù)的字符(字節(jié)),而可以讀寫文件中任意位置上所需要的字符(字節(jié))。指針指向文件開頭的函數(shù)(rewind()函數(shù))調(diào)用的形式:rewind(文件指針)功能:將文件指針重新移動到文件開頭的位置2.fseek()函數(shù)fseek(文件指針,位移量,起始點(diǎn));功能:用來移動文件內(nèi)部位置指針位移量,可以為正數(shù)也可以為負(fù)數(shù),如果為正數(shù),指針向地址高的方向移動,如果為負(fù)數(shù),指針向地址低的方向移動,若位移量為常數(shù),要求加后綴L;起始點(diǎn)必須是0,1,2中的一個,分別代表以下三個符號常量起始點(diǎn)表示符號含義0SEEK_SET文件開始1SEEK_CUR當(dāng)前文件指針位置2SEEK_END文件末尾fseek()函數(shù)一般用于二進(jìn)制文件,因?yàn)槲谋疚募l(fā)生字符轉(zhuǎn)換,計算位置時往往會發(fā)生混亂。fseek(fp,100L,0);其意義是把位置指針移到離文件首100個字節(jié)處。fseek(fp,20L,1);將位置指針移到離當(dāng)前位置20個字節(jié)的位置(向地址高的方向移動)。fseek(fp,-20L,1);將位置指針移到離當(dāng)前位置20個字節(jié)的位置(向地址低的方向移動)。fseek(fp,-30L,2);將位置指針移到距離文件末尾30個字節(jié)的位置。三、相關(guān)知識所謂隨機(jī)讀寫,是指讀完上一個字符(字節(jié))后,并不32【例8-5】有5個學(xué)生,每個學(xué)生有3門課的成績,從鍵盤上

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論