




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
项目八学生成绩文件管理
项目要求将一个班40个同学的相关数据,存入文件中,再从文件中读出,并将此数据按照平均分数从高到低进行排序后输出在屏幕上和另一文件中。项目分析要完成学生成绩的文件管理,第一必须要了解文件的概念,然后学会文件的打开与关闭;第二必须会对文件进行读取与写入。所以,将这一项目分成二个任务介绍。任务一是将学生成绩顺序读写到文件中;任务二是学生成绩随机读写到文件中。项目八学生成绩文件管理项目要求项目分析1任务1将学生成绩顺序读写到文件中
一、问题情景(1)有一个班共40个同学参加了一次数学考试,现要将这个班的同学的成绩存到文件中,便于以后的管理,请编一个程序实现之。(2)在上题的基础上,再把存到文件中的数据读出来,并将其输出在显示器上。二、具体实现#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);//关闭文件p=fopen(“aaa.txt”,“r”);/*打开一个文件用以读入文本文件*//*将aaa.txt文件中的数据读入到数组b中*/for(i=0;i<10;i++)fscanf(p,"%d",&b[i]);/*输出数组b*/for(i=0;i<10;i++)printf("%3d",b[i]);fclose(p);}1、文件的打开与关闭;2、文件的读写;任务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)}三、相关知识(一)文件的打开关闭。FILE*pFILE*3(二)文件的读写(二)文件的读写fprintf()函数和fscanf()函数调用格式: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);//关闭文件p=fopen("aaa.txt","r");
/*将aaa.txt文件中的数据读入到数组b中*/for(i=0;i<10;i++)fscanf(p,"%d",&b[i]);/*输出数组b*/for(i=0;i<10;i++)printf("%3d",b[i]);fclose(p);}分析问题情景中的C程序(二)文件的读写(二)文件的读写例如:#include4【例8-1】从键盘中输入一个学生的姓名及数学、英语、语文三门课的成绩,计算这个同学的平均分,然后将此同学的有关信息写入到文件cc.txt中;再把cc.txt文件中的数据读入并输出。分析:(1)需要定义一个字符数组存放姓名,三个整型变量存放三门课的成绩,一个实型变量用来存用平均分;(2)在键盘上读入此同学的姓名、三门课的成绩,并计算平均分;(3)将姓名、三门课的成绩、平均分写入到以写入形式打开的文本文件cc.txt中,然后关闭此文件;(4)将cc.txt文件以只读的形式打开后,将此文件中的数据读入到指定的变量中;(5)在显示器上输出变量;#include"stdio.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-1】从键盘中输入一个学生的姓名及数学、英语、语文三门5【例8-2】从键盘中输入10个学生的姓名及数学、英语、语文三门课的成绩,计算每个同学的平均分,然后将此10个同学的姓名、三门课的成绩及平均分写入到文本文件aa.txt中。分析:编写此题的思路是:(1)需要定义一个结构体数组,用于存放10个同学的姓名、三门课的成绩及平均分;(2)在键盘上读入10个同学的姓名、三门课的成绩,然后计算每个同学的平均分;(3)将10个同学的姓名、三门课的成绩及平均分写入到文本文件aa.txt中;程序如下:#include"stdio.h"#include"process.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;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;/*将十个同学的姓名、三门课成绩、平均分写入到文件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);//关闭文件}输入的数据如下:打开件aa.txt【例8-2】从键盘中输入10个学生的姓名及数学、英语、语文三6【例8-3】将上例中的文本文件aa.txt数据读出,并将读出的数据输出在显示器上。分析:(1)定义一个结构体数组,用以存放读出的数据;(2)以只读的形式打开文件文件aa.txt;(3)将文本文件aa.txt中的数据读入到结构体数组中;(4)在显示器上输出此数组;#include"stdio.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;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;/*输出结构体数组student*/printf("从文件aa.txt中读出的数据为:\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);}显然,输出的结果就是上例中的数据。【例8-3】将上例中的文本文件aa.txt数据读出,并将读出72.fread()函数、fwrite()函数将一组数据,如一个数组元素,一个结构变量的值等一次性读写,其输入输出函数是二进制形式输入输出的函数,在输入输出中不必进行数据的转换,输入输出速度相对较快。读写数据块函数调用的一般形式为:fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);说明:buffer:对于fread()来说,指的是读入数据的存放地址;对于fwrite来说,是要输出数据的地址。size读写数据时,每笔数据的大小count:读写数据的笔数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()函数、fwrite()函数将8用fread()、fwrite()函数将【例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("请输入十个学生的数据\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);/*关闭文件*/fclose(fp);if((fp=fopen("aa.dat","rb"))==NULL){printf("打不开文件\n");exit(1);}yy=ss;/*一次性读入十个同学的数据*/fread(yy,sizeof(structstu),10,fp);/*在显示器上显示结果*/printf("文件读出后的数据为:\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用来在文件中读入以写入的形式打开二进制文件aa.dat一次性写入十个数据以读入的形式打开二进制文件aa.dat一次性读入十个数据用fread()、fwrite()函数将【例8-2】【例8-93.feof()函数功能是检测文件是否到文件尾,若是文件尾,则其值为真,若不是文件尾,则其值为假。调用的一般形式:feof(文件指针)【例8-4】打开例8-2中建立的文件aa.txt,输入姓名,在aa.txt文件中查找该学生,找到以后输出该学生的所有数据,如果文件中没有输入的姓名,给出相应的提示信息。分析:(1)要打开文件aa.txt(2)输入要查找的姓名(3)读一条记录,检查此记录中的姓名是否与要查找的姓名一致,若一致,则输出此记录。(4)如果不是文件尾,则一直重复(3)(5)如果记录全查遍,无此记录,则输出相应信息。3.feof()函数功能是检测文件是否到文件尾,若是文件尾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任务2将学生成绩随机读写到文件中一、问题情景从键盘中输入一个班40个学生的姓名及数学、英语、语文三门课的成绩,计算每个同学的平均分,然后将此40个同学的姓名、三门课的成绩及平均分写入到文本文件aa.txt中;再从文件中读取第2,4,6,8,10个学生的数据并输出在显示器上。分析:例8-2、例8-3中的文件读入和写入都是顺序读写,而本任务中的问题是要求随机读写,即按要求进行读写。换句话说,就是人为的控制当前文件指针的移动,让文件指针随意指向我们想要指向的位置,而不是像以往那样按物理顺序逐个移动,这就是所谓对文件的定位与随机读写。任务2将学生成绩随机读写到文件中一、问题情景12二、具体实现(为了程序运行方便,所以假设只有10个学生)#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("请输入十个学生的数据\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);}}知识点是:1、文件的定位;2、文件的随机读写;二、具体实现(为了程序运行方便,所以假设只有10个学生)#i13三、相关知识所谓随机读写,是指读完上一个字符(字节)后,并不一定要读写其后续的字符(字节),而可以读写文件中任意位置上所需要的字符(字节)。指针指向文件开头的函数(rewind()函数)调用的形式:rewind(文件指针)功能:将文件指针重新移动到文件开头的位置2.fseek()函数fseek(文件指针,位移量,起始点);功能:用来移动文件内部位置指针位移量,可以为正数也可以为负数,如果为正数,指针向地址高的方向移动,如果为负数,指针向地址低的方向移动,若位移量为常数,要求加后缀L;起始点必须是0,1,2中的一个,分别代表以下三个符号常量起始点表示符号含义0SEEK_SET文件开始1SEEK_CUR当前文件指针位置2SEEK_END文件末尾fseek()函数一般用于二进制文件,因为文本文件要发生字符转换,计算位置时往往会发生混乱。fseek(fp,100L,0);其意义是把位置指针移到离文件首100个字节处。fseek(fp,20L,1);将位置指针移到离当前位置20个字节的位置(向地址高的方向移动)。fseek(fp,-20L,1);将位置指针移到离当前位置20个字节的位置(向地址低的方向移动)。fseek(fp,-30L,2);将位置指针移到距离文件末尾30个字节的位置。三、相关知识所谓随机读写,是指读完上一个字符(字节)后,并不14【例8-5】有5个学生,每个学生有3门课的成绩,从键盘上分别输入每个学生的学号、姓名、和3门课的成绩,保存到一个名为ddd.dat的二进制文件中去,然后在ddd.dat文件中读出第三个学生的数据。分析:编写此题的思路是:(1)需要定义一个结构体数组,用于存放5个同学的姓名、三门课的成绩;(2)在键盘上读入5个同学的姓名、三门课的成绩5;(3)以读写的形式打开二制文件ddd.dat,将5个同学的姓名、三门课的成绩写入到文件中;(4)将ddd.dat文件位置指针移到文件首,然后移动文件位置指针,将它定位在第三条记录上,将数据读入并显示在显示器上;(5)关闭文件;程序如下:#include"stdio.h"#include“process.h”/*有exit()函数,所有用此库函数*/#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个学生的数据\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("输出的第三个同学的信息为:\n");printf("%s%d%d%d\n",pp->name,pp->math,pp->englist,pp->chinese);fclose(fp);}以读写的形式打开文件将文件位置指针移动文件首
从文件头开始,移动文件位置指针到第三位【例8-5】有5个学生,每个学生有3门课的成绩,从键盘上分别15任务3举一反三【例8-6】从键盘上输入10个整数,分别以文本文件和二进制文件方式存入磁盘。分析:要打开二个文件,一个文件以文本文件方式存入磁盘,另一个文件以二进制方式存入磁盘,分别用fprintf()函数和fwrite()函数写入程序如下:#include"stdio.h"#defineN10main(){intx[10],i,y[10];FILE*fp1,*fp2;fp1=fopen("d1.txt","w+");fp2=fopen("d2.dat","wb+");printf("请输入%d个数:\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);}将键盘中输入的数写入到文本文件d1.dat中;
一次性写入数据到二进制文件d2.dat中任务3举一反三【例8-6】从键盘上输入10个整数,分别以16【例8-7】从上例中的文件d1.txt及d2.dat中读出并显示在显示器上。分析:要打开二个文件,一个文件以文本文件方式读入内存,另一个文件以二进制方式读入内存,分别用fscanf()函数和fread()函数读入。程序如下:#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读入到数组y中将文件d2.dat读入到数组x中【例8-7】从上例中的文件d1.txt及d2.dat中读出并17【例8-8】将d2.dat中的1、3、5、7、9数据读出并显示在显示器上#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);}在文件中定位并将此数读出,同时显示在屏幕上【例8-8】将d2.dat中的1、3、5、7、9数据读出并显18项目八学生成绩文件管理
项目要求将一个班40个同学的相关数据,存入文件中,再从文件中读出,并将此数据按照平均分数从高到低进行排序后输出在屏幕上和另一文件中。项目分析要完成学生成绩的文件管理,第一必须要了解文件的概念,然后学会文件的打开与关闭;第二必须会对文件进行读取与写入。所以,将这一项目分成二个任务介绍。任务一是将学生成绩顺序读写到文件中;任务二是学生成绩随机读写到文件中。项目八学生成绩文件管理项目要求项目分析19任务1将学生成绩顺序读写到文件中
一、问题情景(1)有一个班共40个同学参加了一次数学考试,现要将这个班的同学的成绩存到文件中,便于以后的管理,请编一个程序实现之。(2)在上题的基础上,再把存到文件中的数据读出来,并将其输出在显示器上。二、具体实现#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);//关闭文件p=fopen(“aaa.txt”,“r”);/*打开一个文件用以读入文本文件*//*将aaa.txt文件中的数据读入到数组b中*/for(i=0;i<10;i++)fscanf(p,"%d",&b[i]);/*输出数组b*/for(i=0;i<10;i++)printf("%3d",b[i]);fclose(p);}1、文件的打开与关闭;2、文件的读写;任务1将学生成绩顺序读写到文件中一、问题情景二、具体实现20三、相关知识(一)文件的打开关闭。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)}三、相关知识(一)文件的打开关闭。FILE*pFILE*21(二)文件的读写(二)文件的读写fprintf()函数和fscanf()函数调用格式: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);//关闭文件p=fopen("aaa.txt","r");
/*将aaa.txt文件中的数据读入到数组b中*/for(i=0;i<10;i++)fscanf(p,"%d",&b[i]);/*输出数组b*/for(i=0;i<10;i++)printf("%3d",b[i]);fclose(p);}分析问题情景中的C程序(二)文件的读写(二)文件的读写例如:#include22【例8-1】从键盘中输入一个学生的姓名及数学、英语、语文三门课的成绩,计算这个同学的平均分,然后将此同学的有关信息写入到文件cc.txt中;再把cc.txt文件中的数据读入并输出。分析:(1)需要定义一个字符数组存放姓名,三个整型变量存放三门课的成绩,一个实型变量用来存用平均分;(2)在键盘上读入此同学的姓名、三门课的成绩,并计算平均分;(3)将姓名、三门课的成绩、平均分写入到以写入形式打开的文本文件cc.txt中,然后关闭此文件;(4)将cc.txt文件以只读的形式打开后,将此文件中的数据读入到指定的变量中;(5)在显示器上输出变量;#include"stdio.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-1】从键盘中输入一个学生的姓名及数学、英语、语文三门23【例8-2】从键盘中输入10个学生的姓名及数学、英语、语文三门课的成绩,计算每个同学的平均分,然后将此10个同学的姓名、三门课的成绩及平均分写入到文本文件aa.txt中。分析:编写此题的思路是:(1)需要定义一个结构体数组,用于存放10个同学的姓名、三门课的成绩及平均分;(2)在键盘上读入10个同学的姓名、三门课的成绩,然后计算每个同学的平均分;(3)将10个同学的姓名、三门课的成绩及平均分写入到文本文件aa.txt中;程序如下:#include"stdio.h"#include"process.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;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;/*将十个同学的姓名、三门课成绩、平均分写入到文件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);//关闭文件}输入的数据如下:打开件aa.txt【例8-2】从键盘中输入10个学生的姓名及数学、英语、语文三24【例8-3】将上例中的文本文件aa.txt数据读出,并将读出的数据输出在显示器上。分析:(1)定义一个结构体数组,用以存放读出的数据;(2)以只读的形式打开文件文件aa.txt;(3)将文本文件aa.txt中的数据读入到结构体数组中;(4)在显示器上输出此数组;#include"stdio.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;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;/*输出结构体数组student*/printf("从文件aa.txt中读出的数据为:\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);}显然,输出的结果就是上例中的数据。【例8-3】将上例中的文本文件aa.txt数据读出,并将读出252.fread()函数、fwrite()函数将一组数据,如一个数组元素,一个结构变量的值等一次性读写,其输入输出函数是二进制形式输入输出的函数,在输入输出中不必进行数据的转换,输入输出速度相对较快。读写数据块函数调用的一般形式为:fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);说明:buffer:对于fread()来说,指的是读入数据的存放地址;对于fwrite来说,是要输出数据的地址。size读写数据时,每笔数据的大小count:读写数据的笔数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()函数、fwrite()函数将26用fread()、fwrite()函数将【例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("请输入十个学生的数据\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);/*关闭文件*/fclose(fp);if((fp=fopen("aa.dat","rb"))==NULL){printf("打不开文件\n");exit(1);}yy=ss;/*一次性读入十个同学的数据*/fread(yy,sizeof(structstu),10,fp);/*在显示器上显示结果*/printf("文件读出后的数据为:\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用来在文件中读入以写入的形式打开二进制文件aa.dat一次性写入十个数据以读入的形式打开二进制文件aa.dat一次性读入十个数据用fread()、fwrite()函数将【例8-2】【例8-273.feof()函数功能是检测文件是否到文件尾,若是文件尾,则其值为真,若不是文件尾,则其值为假。调用的一般形式:feof(文件指针)【例8-4】打开例8-2中建立的文件aa.txt,输入姓名,在aa.txt文件中查找该学生,找到以后输出该学生的所有数据,如果文件中没有输入的姓名,给出相应的提示信息。分析:(1)要打开文件aa.txt(2)输入要查找的姓名(3)读一条记录,检查此记录中的姓名是否与要查找的姓名一致,若一致,则输出此记录。(4)如果不是文件尾,则一直重复(3)(5)如果记录全查遍,无此记录,则输出相应信息。3.feof()函数功能是检测文件是否到文件尾,若是文件尾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任务2将学生成绩随机读写到文件中一、问题情景从键盘中输入一个班40个学生的姓名及数学、英语、语文三门课的成绩,计算每个同学的平均分,然后将此40个同学的姓名、三门课的成绩及平均分写入到文本文件aa.txt中;再从文件中读取第2,4,6,8,10个学生的数据并输出在显示器上。分析:例8-2、例8-3中的文件读入和写入都是顺序读写,而本任务中的问题是要求随机读写,即按要求进行读写。换句话说,就是人为的控制当前文件指针的移动,让文件指针随意指向我们想要指向的位置,而不是像以往那样按物理顺序逐个移动,这就是所谓对文件的定位与随机读写。任务2将学生成绩随机读写到文件中一、问题情景30二、具体实现(为了程序运行方便,所以假设只有10个学生)#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("请输入十个学生的数据\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);}}知识点是:1、文件的定位;2、文件的随机读写;二、具体实现(为了程序运行方便,所以假设只有10个学生)#i31三、相关知识所谓随机读写,是指读完上一个字符(字节)后,并不一定要读写其后续的字符(字节),而可以读写文件中任意位置上所需要的字符(字节)。指针指向文件开头的函数(rewind()函数)调用的形式:rewind(文件指针)功能:将文件指针重新移动到文件开头的位置2.fseek()函数fseek(文件指针,位移量,起始点);功能:用来移动文件内部位置指针位移量,可以为正数也可以为负数,如果为正数,指针向地址高的方向移动,如果为负数,指针向地址低的方向移动,若位移量为常数,要求加后缀L;起始点必须是0,1,2中的一个,分别代表以下三个符号常量起始点表示符号含义0SEEK_SET文件开始1SEEK_CUR当前文件指针位置2SEEK_END文件末尾fseek()函数一般用于二进制文件,因为文本文件要发生字符转换,计算位置时往往会发生混乱。fseek(fp,100L,0);其意义是把位置指针移到离文件首100个字节处。fseek(fp,20L,1);将位置指针移到离当前位置20个字节的位置(向地址高的方向移动)。fseek(fp,-20L,1);将位置指针移到离当前位置20个字节的位置(向地址低的方向移动)。fseek(fp,-30L,2);将位置指针移到距离文件末尾30个字节的位置。三、相关知识所谓随机读写,是指读完上一个字符(字节)后,并不32【例8-5】有5个学生,每个学生有3门课的成绩,从键盘上
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025企业培训合同模板
- 2025年户外广告牌制作与安装合同
- 2025家具类标准长期供货合同
- 2025新版私人汽车租赁合同范本
- 杭州租房合同书协议书范例二零二五年
- 土方工程施工承包协议
- 家装设计合同书范例
- 班组劳务用工合同书
- 二零二五版试用期计件制劳动合同书
- 2025四川合同范本
- 2025年职业院校技能大赛“健身指导”赛项考试题库(含答案)
- 2025成都店铺租赁合同范本
- TCECS24-2020钢结构防火涂料应用技术规程
- 2025年上海市虹口区二模生物试卷
- (二模)台州市2025届高三第二次教学质量评估试题 地理试卷(含答案)
- 推动研究生教育高质量发展路径探索
- 社会心理学(西安交通大学)智慧树知到期末考试答案2024年
- 鲁班奖迎检分工细化
- 最新金属软管设计制造新工艺新技术及性能测试实用手册
- 渠道项目报备管理规定
- 心理咨询记录--个案5
评论
0/150
提交评论