C语言程序设计项目八_第1页
C语言程序设计项目八_第2页
C语言程序设计项目八_第3页
C语言程序设计项目八_第4页
C语言程序设计项目八_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、项目八项目八 学生成绩文件管理学生成绩文件管理 项目要求项目要求将一个班40个同学的相关数据,存入文件中,再从文件中读出,并将此数据按照平均分数从高到低进行排序后输出在屏幕上和另一文件中。项目分析项目分析要完成学生成绩的文件管理,第一必须要了解文件的概念,然后学会文件的打开与关闭;第二必须会对文件进行读取与写入。所以,将这一项目分成二个任务介绍。任务一是将学生成绩顺序读写到文件中;任务二是学生成绩随机读写到文件中。任务任务1 将学生成绩顺序读写到文件中将学生成绩顺序读写到文件中 一、问题情景一、问题情景(1)有一个班共40个同学参加了一次数学考试,现要将这个班的同学的成绩存到文件中,便于以后的

2、管理,请编一个程序实现之。(2)在上题的基础上,再把存到文件中的数据读出来,并将其输出在显示器上。二、具体实现二、具体实现#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”); /*打开

3、一个文件用以读入文本文件*/*将aaa.txt文件中的数据读入到数组b中*/for(i=0;i10;i+)fscanf(p,%d,&bi);/*输出数组b*/for(i=0;i10;i+)printf(%3d,bi);fclose(p);1、文件的打开与关闭;2、文件的读写;三、相关知识三、相关知识(一一)文件的打开关闭。文件的打开关闭。1. 文件的概念文件的概念所谓“文件”是指记录在外部介质上的数据的有序集合。从文件的编码方式来看,文件可分为ascii码文件和二进制码文件两种。2. 文件类型指针文件类型指针file *指针变量标识符;例如:file *p;习惯上笼统地把p称为指向一个文件的指

4、针。在进行读写操作之前要先打开文件,使用完毕要关闭文件。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(“n cant open file!”);e

5、xit(1)(二二) 文件的读写文件的读写(二二) 文件的读写文件的读写1. fprintf()函数和fscanf()函数调用格式:fscanf(文件指针,格式字符串,输入表列)fprintf(文件指针,格式字符串,输出表列)例如: fscantf(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

6、;i+)fprintf(p,%5d,ai);fclose(p); /关闭文件p=fopen(aaa.txt,r); /*将aaa.txt文件中的数据读入到数组b中*/for(i=0;i10;i+)fscanf(p,%d,&bi);/*输出数组b*/for(i=0;i10;i+)printf(%3d,bi);fclose(p);分析问题情景中的分析问题情景中的c程序程序 【例8-1】从键盘中输入一个学生的姓名及数学、英语、语文三门课的成绩,计算这个同学的平均分,然后将此同学的有关信息写入到文件cc.txt中;再把cc.txt文件中的数据读入并输出。分析:(1)需要定义一个字符数组存放姓名,三个整

7、型变量存放三门课的成绩,一个实型变量用来存用平均分;(2)在键盘上读入此同学的姓名、三门课的成绩,并计算平均分;(3)将姓名、三门课的成绩、平均分写入到以写入形式打开的文本文件cc.txt中,然后关闭此文件;(4)将cc.txt 文件以只读的形式打开后,将此文件中的数据读入到指定的变量中;(5)在显示器上输出变量;#include stdio.h#include “process.h” /*有exit()函数,所有用此库函数*/main()char name10,n110;int math,english,chinese,m1,e1,c1;float avg,a1; file *fp;/*以写

8、入的形式打开文件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 %.1fn,name,math,english,chinese,avg);fclose(fp);/*以读入的形式打

9、开文件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 %.1fn,n1,m1,e1,c1,a1);【例8-2】从键盘中输入10个学生的姓名及数学、英语、语文三门课的成绩,计算每个同学的平均分,然后将此10个同学的姓名、三门课的成绩及平均分写入到文本文件aa.tx

10、t中。分析:编写此题的思路是:(1)需要定义一个结构体数组,用于存放10个同学的姓名、三门课的成绩及平均分;(2)在键盘上读入10个同学的姓名、三门课的成绩,然后计算每个同学的平均分;(3)将10个同学的姓名、三门课的成绩及平均分写入到文本文件aa.txt中;程序如下:#include stdio.h#include process.h /*定义结构体定义结构体*/struct stuchar name10;int math,english,chinese;float avg;main()stu student10,*pp;file *fp;int i;pp=student;/*以写入的形式打

11、开文件以写入的形式打开文件aa.txt*/if(fp=fopen(aa.txt,w)=null)printf(打不开文件n);exit(1);printf(请输入十个学生的数据n);/*输入十个同学的姓名、成绩并计算每个输入十个同学的姓名、成绩并计算每个同学的平均分同学的平均分*/for(i=0;iname,&pp-math,&pp-english,&pp-chinese);pp-avg=(pp-math+pp-englist+pp-chinese)/3.0;pp=student;/*将十个同学的姓名、三门课成绩、平均将十个同学的姓名、三门课成绩、平均分写入到文件分写入到文件aa.txt中中*

12、/for(i=0;iname,pp-math,pp-english,pp-chinese,pp-avg);fclose(fp); /关闭文件输入的数据如下:打开件aa.txt 【例【例8-3】将上例中的文本文件】将上例中的文本文件aa.txt数据读出,并将读出的数数据读出,并将读出的数据输出在显示器上。据输出在显示器上。分析:(1)定义一个结构体数组,用以存放读出的数据;(2)以只读的形式打开文件文件aa.txt;(3)将文本文件aa.txt中的数据读入到结构体数组中;(4)在显示器上输出此数组;#include stdio.h#include “process.h” /*有exit()函数,

13、所有用此库函数*/*定义结构体*/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;/*从文件中将十个同学的姓名、三门课成绩、平均分读入到结构体数组student中*/for(i=0;iname,&pp-math,&pp-english,&pp-chinese,&pp-avg);fclose(f

14、p);pp=student;/*输出结构体数组student*/printf(从文件aa.txt中读出的数据为:n);for(i=0;iname,pp-math,pp-english,pp-chinese,pp-avg);fclose(fp);显然,输出的结果就是上例中的数据。2. fread()函数、函数、fwrite()函数函数 将一组数据,如一个数组元素,一个结构变量的值等一次性读写,其输入输出函数是二进制形式输入输出的函数,在输入输出中不必进行数据的转换,输入输出速度相对较快。读写数据块函数调用的一般形式为:读写数据块函数调用的一般形式为:fread(buffer,size,count

15、,fp);fwrite(buffer,size,count,fp);说明:buffer:对于fread()来说,指的是 读入数据的存放地址; 对于fwrite来说,是要输出数据的地址。size读写数据时,每笔数据的大小count: 读写数据的笔数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);fwrite(pp,sizeof(struct st

16、u),10,fp);用用fread()、fwrite()函数将【例函数将【例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(请输入十个学生的数据n);for(

17、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;/*一次性读入十个同学的数据*/fread(yy,sizeof(struct stu),10,fp);/*在显示器上显示结果*/printf(文件读出后的数据为:n);f

18、or(i=0;iname,yy-math,yy-englist,yy-chinese,yy-avg);fclose(fp);student用来在键盘上读入,ss用来在文件中读入 以写入的形式打开二进制文件aa.dat一次性写入十个数据以读入的形式打开二进制文件aa.dat一次性读入十个数据3. feof()函数函数功能是检测文件是否到文件尾,若是文件尾,则其值为真,若不是文件尾,则其值为假。调用的一般形式:feof(文件指针)【例8-4】打开例8-2中建立的文件aa.txt,输入姓名,在aa.txt文件中查找该学生,找到以后输出该学生的所有数据,如果文件中没有输入的姓名,给出相应的提示信息。分

19、析:(1)要打开文件aa.txt(2)输入要查找的姓名(3)读一条记录,检查此记录中的姓名是否与要查找的姓名一致,若一致,则输 出此记录。 (4)如果不是文件尾,则一直重复(3)(5)如果记录全查遍,无此记录,则输出相应信息。#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

20、);printf(请输入要查找的姓名:);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) prin

21、tf(对不起,查无此人!n); fclose(fp);任务任务2 将学生成绩随机读写到文件中将学生成绩随机读写到文件中 一、问题情景一、问题情景 从键盘中输入一个班40个学生的姓名及数学、英语、语文三门课的成绩,计算每个同学的平均分,然后将此40个同学的姓名、三门课的成绩及平均分写入到文本文件aa.txt中;再从文件中读取第 2, 4,6,8,10 个学生的数据并输出在显示器上。分析:例8-2、例8-3中的文件读入和写入都是顺序读写,而本任务中的问题是要求随机读写,即按要求进行读写。换句话说,就是人为的控制当前文件指针的移动,让文件指针随意指向我们想要指向的位置,而不是像以往那样按物理顺序逐个

22、移动,这就是所谓对文件的定位与随机读写。二、具体实现(为了程序运行方便,所以假设只有二、具体实现(为了程序运行方便,所以假设只有10个学生)个学生)#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(请输入十个学生的数据n);for(

23、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);yy=ss;rewind(fp); /定位到文件头for(i=1;iname,yy-math,yy-englist,yy-chinese,yy-avg);知识点是:知识点是: 1、文件的定位;、文件的定位; 2、文件的随机读写;、文件的随机读写;三、相关知识三、相关知识所谓随机读写,是指读完上一个字符(字节)后,并不一定要读写其后

24、续的字符(字节),而可以读写文件中任意位置上所需要的字符(字节)。1. 指针指向文件开头的函数(指针指向文件开头的函数(rewind()函数)函数)调用的形式:rewind(文件指针) 功能:将文件指针重新移动到文件开头的位置 2. fseek()函数函数fseek(文件指针, 位移量, 起始点);功能:用来移动文件内部位置指针 位移量,可以为正数也可以为负数,如果为正数,指针向地址高的方向移动,如果为负数,指针向地址低的方向移动,若位移量为常数,要求加后缀l;起始点必须是0,1,2中的一个,分别代表以下三个符号常量 起始点 表示符号 含义 0 seek_set 文件开始 1 seek_cur

25、 当前文件指针位置 2 seek_end 文件末尾 fseek()函数一般用于二进制文件,因为文本文件要发生字符转换,计算位置时往往会发生混乱。fseek(fp, 100l, 0);其意义是把位置指针移到离文件首100个字节处。fseek(fp,20l,1);将位置指针移到离当前位置20个字节的位置(向地址高的方向移动)。 fseek(fp,-20l,1);将位置指针移到离当前位置20个字节的位置(向地址低的方向移动)。 fseek(fp,-30l,2);将位置指针移到距离文件末尾30个字节的位置。【例8-5】有5个学生,每个学生有3门课的成绩,从键盘上分别输入每个学生的学号、姓名、和3门课的

26、成绩,保存到一个名为ddd.dat的二进制文件中去,然后在ddd.dat文件中读出第三个学生的数据。分析:编写此题的思路是:(1)需要定义一个结构体数组,用于存放5个同学的姓名、三门课的成绩;(2)在键盘上读入5个同学的姓名、三门课的成绩5;(3)以读写的形式打开二制文件ddd.dat,将5个同学的姓名、三门课的成绩写入到文件中;(4)将ddd.dat文件位置指针移到文件首,然后移动文件位置指针,将它定位在第三条记录上,将数据读入并显示在显示器上;(5)关闭文件;程序如下:#include stdio.h#include “process.h” /*有exit()函数,所有用此库函数*/#de

27、fine n 5 struct stuchar name10;int math,englist,chinese;main()stu studentn,*pp;file *fp;int i;pp=student;if(fp=fopen(ddd.dat,wb+)=null) printf(打不开文件打不开文件n);exit(1);printf(请输入%d个学生的数据n,n);for(i=0;iname,&pp-math,&pp-englist,&pp-chinese);pp=student;fwrite(pp,sizeof(struct stu),5,fp);rewind(fp); fseek(f

28、p,2*sizeof(struct stu),0); fread(pp,sizeof(struct stu),1,fp);printf(输出的第三个同学的信息为:n);printf(%s %d %d %d n,pp-name,pp-math,pp-englist,pp-chinese);fclose(fp);以读写的形式打开文件以读写的形式打开文件将文件位置指针移动文件首将文件位置指针移动文件首 从文件头开始,移动文件位从文件头开始,移动文件位置指针到第三位置指针到第三位任务任务3 举一反三举一反三【例8-6】从键盘上输入10个整数,分别以文本文件和二进制文件方式存入磁盘。分析:要打开二个文件,一个文件以文本文件方式存入磁盘,另一个文件以二进制方式存入磁盘,分别用fprintf()函数和fwrite()函数写入 程序如下:#include stdio.h#define n 10main() int x10,i,y10;file *fp1,*fp2;fp1=fopen

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论