您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 项目八 学生成绩文件管理
项目八学生成绩文件管理项目要求将一个班40个同学的相关数据,存入文件中,再从文件中读出,并将此数据按照平均分数从高到低进行排序后输出在屏幕上和另一文件中。项目分析要完成学生成绩的文件管理,第一必须要了解文件的概念,然后学会文件的打开与关闭;第二必须会对文件进行读取与写入。所以,将这一项目分成二个任务介绍。任务一是将学生成绩顺序读写到文件中;任务二是学生成绩随机读写到文件中。任务1将学生成绩顺序读写到文件中一、问题情景(1)有一个班共40个同学参加了一次数学考试,现要将这个班的同学的成绩存到文件中,便于以后的管理,请编一个程序实现之。(2)在上题的基础上,再把存到文件中的数据读出来,并将其输出在显示器上。二、具体实现#includestdio.hmain(){inta[10],i,b[10];FILE*p;/*定义一个文件指针类型的变量*/p=fopen(“aaa.txt”,“w”);/*打开一个文件用以写入文本文件*/for(i=0;i10;i++)scanf(%d,&a[i]);/*将输入的成绩以5d的格式保存在文件aaa.txt中*/for(i=0;i10;i++)fprintf(p,%5d,a[i]);fclose(p);//关闭文件p=fopen(“aaa.txt”,“r”);/*打开一个文件用以读入文本文件*//*将aaa.txt文件中的数据读入到数组b中*/for(i=0;i10;i++)fscanf(p,%d,&b[i]);/*输出数组b*/for(i=0;i10;i++)printf(%3d,b[i]);fclose(p);}1、文件的打开与关闭;2、文件的读写;三、相关知识(一)文件的打开关闭。1.文件的概念所谓“文件”是指记录在外部介质上的数据的有序集合。从文件的编码方式来看,文件可分为ASCII码文件和二进制码文件两种。2.文件类型指针FILE*指针变量标识符;例如:FILE*p;习惯上笼统地把p称为指向一个文件的指针。在进行读写操作之前要先打开文件,使用完毕要关闭文件。3.文件的打开与关闭(1)文件的打开(fopen()函数)fopen()函数用来打开一个文件,其调用的一般形式为:FILE*pp=fopen(文件名,使用文件方式)(2)文件的关闭(fclose函数)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)}(二)文件的读写(二)文件的读写1.fprintf()函数和fscanf()函数调用格式:fscanf(文件指针,格式字符串,输入表列)fprintf(文件指针,格式字符串,输出表列)例如:fscantf(p,”%d,%f”,&a,&b);fprintf(p,”%d,%f”,a,b);#includestdio.hmain(){inta[10],i,b[10];FILE*p;p=fopen(aaa.txt,w);for(i=0;i10;i++)scanf(%d,&a[i]);/*将输入的成绩以5d的格式保存在文件aaa.txt中*/for(i=0;i10;i++)fprintf(p,%5d,a[i]);fclose(p);//关闭文件p=fopen(aaa.txt,r);/*将aaa.txt文件中的数据读入到数组b中*/for(i=0;i10;i++)fscanf(p,%d,&b[i]);/*输出数组b*/for(i=0;i10;i++)printf(%3d,b[i]);fclose(p);}分析问题情景中的C程序【例8-1】从键盘中输入一个学生的姓名及数学、英语、语文三门课的成绩,计算这个同学的平均分,然后将此同学的有关信息写入到文件cc.txt中;再把cc.txt文件中的数据读入并输出。分析:(1)需要定义一个字符数组存放姓名,三个整型变量存放三门课的成绩,一个实型变量用来存用平均分;(2)在键盘上读入此同学的姓名、三门课的成绩,并计算平均分;(3)将姓名、三门课的成绩、平均分写入到以写入形式打开的文本文件cc.txt中,然后关闭此文件;(4)将cc.txt文件以只读的形式打开后,将此文件中的数据读入到指定的变量中;(5)在显示器上输出变量;#includestdio.h#include“process.h”/*有exit()函数,所有用此库函数*/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(请输入这个学生的数据\n);/*输入该同学的姓名、成绩并计算该同学的平均分*/scanf(%s%d%d%d,name,&math,&english,&chinese);avg=(math+english+chinese)/3.0;/*将此同学的姓名、三门课成绩、平均分写入到文件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);}/*将该同学的姓名、三门课成绩、平均分读入到指定的变量中*/fscanf(fp,%s%d%d%d%f,n1,&m1,&e1,&c1,&a1);fclose(fp);/*在显示器上输出数据*/printf(从文件中读出的数据为:\n);printf(%s%d%d%d%.1f\n,n1,m1,e1,c1,a1);}【例8-2】从键盘中输入10个学生的姓名及数学、英语、语文三门课的成绩,计算每个同学的平均分,然后将此10个同学的姓名、三门课的成绩及平均分写入到文本文件aa.txt中。分析:编写此题的思路是:(1)需要定义一个结构体数组,用于存放10个同学的姓名、三门课的成绩及平均分;(2)在键盘上读入10个同学的姓名、三门课的成绩,然后计算每个同学的平均分;(3)将10个同学的姓名、三门课的成绩及平均分写入到文本文件aa.txt中;程序如下:#includestdio.h#includeprocess.h/*定义结构体*/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(请输入十个学生的数据\n);/*输入十个同学的姓名、成绩并计算每个同学的平均分*/for(i=0;i10;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;/*将十个同学的姓名、三门课成绩、平均分写入到文件aa.txt中*/for(i=0;i10;i++,pp++)fprintf(fp,%s%d%d%d%.1f\n,pp-name,pp-math,pp-english,pp-chinese,pp-avg);fclose(fp);//关闭文件}输入的数据如下:打开件aa.txt【例8-3】将上例中的文本文件aa.txt数据读出,并将读出的数据输出在显示器上。分析:(1)定义一个结构体数组,用以存放读出的数据;(2)以只读的形式打开文件文件aa.txt;(3)将文本文件aa.txt中的数据读入到结构体数组中;(4)在显示器上输出此数组;#includestdio.h#include“process.h”/*有exit()函数,所有用此库函数*//*定义结构体*/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;/*从文件中将十个同学的姓名、三门课成绩、平均分读入到结构体数组student中*/for(i=0;i10;i++,pp++)fscanf(fp,%s%d%d%d%f,pp-name,&pp-math,&pp-english,&pp-chinese,&pp-avg);fclose(fp);pp=student;/*输出结构体数组student*/printf(从文件aa.txt中读出的数据为:\n);for(i=0;i10;i++,pp++)printf(%s%d%d%d%.1f\n,pp-name,pp-math,pp-english,pp-chinese,pp-avg);fclose(fp);}显然,输出的结果就是上例中的数据。2.fread()函数、fwrite()函数将一组数据,如一个数组元素,一个结构变量的值等一次性读写,其输入输出函数是二进制形式输入输出的函数,在输入输出中不必进行数据的转换,输入输出速度相对较快。读写数据块函数调用的一般形式为:fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);说明:buffer:对于fread()来说,指的是读入数据的存放地址;对于fwrite来说,是要输出数据的地址。size读写数据时,每笔数据的大小count:读写数据的笔数fp:文件指针for(i=0;i10;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;i10;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);用fread()、fwrite()函数将【例8-2】【例8-3】合成后的程序如下#includestdio.h#includeprocess.hstructstu{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(请输入十个学生的数据\n);for(i=0;i10;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,
本文标题:项目八 学生成绩文件管理
链接地址:https://www.777doc.com/doc-805606 .html