C语言程序设计项目八.ppt

上传人:tia****nde 文档编号:2884469 上传时间:2019-12-03 格式:PPT 页数:18 大小:491.50KB
返回 下载 相关 举报
C语言程序设计项目八.ppt_第1页
第1页 / 共18页
C语言程序设计项目八.ppt_第2页
第2页 / 共18页
C语言程序设计项目八.ppt_第3页
第3页 / 共18页
点击查看更多>>
资源描述
项目八 学生成绩文件管理,项目要求 将一个班40个同学的相关数据,存入文件中,再从文件中读出,并将此数据按照平均分数从高到低进行排序后输出在屏幕上和另一文件中。,项目分析 要完成学生成绩的文件管理,第一必须要了解文件的概念,然后学会文件的打开与关闭;第二必须会对文件进行读取与写入。所以,将这一项目分成二个任务介绍。任务一是将学生成绩顺序读写到文件中;任务二是学生成绩随机读写到文件中。,任务1 将学生成绩顺序读写到文件中,一、问题情景 (1)有一个班共40个同学参加了一次数学考试,现要将这个班的同学的成绩存到文件中,便于以后的管理,请编一个程序实现之。 (2)在上题的基础上,再把存到文件中的数据读出来,并将其输出在显示器上。,二、具体实现 #include “stdio.h“ main() int a10,i,b10; FILE *p; /*定义一个文件指针类型的变量*/ p=fopen(“aaa.txt”,“w”); /*打开一个文件用以写入文本文件*/ for(i=0;i10;i+) scanf(“%d“, /关闭文件,p=fopen(“aaa.txt”,“r”); /*打开一个文件用以读入文本文件*/ /*将aaa.txt文件中的数据读入到数组b中*/ for(i=0;i10;i+) fscanf(p,“%d“,1、文件的打开与关闭; 2、文件的读写;,三、相关知识,(一)文件的打开关闭。 1. 文件的概念 所谓“文件”是指记录在外部介质上的数据的有序集合。从文件的编码方式来看,文件可分为ASCII码文件和二进制码文件两种。 2. 文件类型指针 FILE *指针变量标识符; 例如:FILE *p; 习惯上笼统地把p称为指向一个文件的指针。 在进行读写操作之前要先打开文件,使用完毕要关闭文件。 3. 文件的打开与关闭 (1)文件的打开(fopen()函数) fopen()函数用来打开一个文件,其调用的一般形式为: FILE *p p=fopen(文件名,使用文件方式) (2)文件的关闭(fclose函数) fclose(文件指针) 例如: fclose(p);,FILE *p p=fopen(“aa.dat”,”r”),FILE *fp fp=fopen(“d:a1.dat”,”rb”);,FILE *fp; if (fp=fopen(“d:aa.dat”,”r”)=NULL) printf(“n cant open file!”); exit(1),(二) 文件的读写,(二) 文件的读写 fprintf()函数和fscanf()函数 调用格式: fscanf(文件指针,格式字符串,输入表列) fprintf(文件指针,格式字符串,输出表列),例如: fscantf(p,”%d,%f”,#include “stdio.h“ main() int a10,i,b10; FILE *p; p=fopen(“aaa.txt“,“w“); for(i=0;i10;i+) scanf(“%d“, /*将输入的成绩以5d的格式保存在文件aaa.txt中*/,for(i=0;i10;i+) fprintf(p,“%5d“,ai); fclose(p); /关闭文件 p=fopen(“aaa.txt“,“r“); /*将aaa.txt文件中的数据读入到数组b中*/ for(i=0;i10;i+) fscanf(p,“%d“,分析问题情景中的C程序,【例8-1】从键盘中输入一个学生的姓名及数学、英语、语文三门课的成绩,计算这个同学的平均分,然后将此同学的有关信息写入到文件cc.txt中;再把cc.txt文件中的数据读入并输出。,分析: (1)需要定义一个字符数组存放姓名,三个整型变量存放三门课的成绩,一个实型变量用来存用平均分; (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; /*以写入的形式打开文件cc.txt*/ if(fp=fopen(“cc.txt“,“w“)=NULL) printf(“打不开文件n“); exit(1); printf(“请输入这个学生的数据n“); /*输入该同学的姓名、成绩并计算该同学的平均分*/ scanf(“%s%d%d%d“,name,/*将此同学的姓名、三门课成绩、平均分写入到文件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, ,【例8-2】从键盘中输入10个学生的姓名及数学、英语、语文三门课的成绩,计算每个同学的平均分,然后将此10个同学的姓名、三门课的成绩及平均分写入到文本文件aa.txt中。,分析:编写此题的思路是: (1)需要定义一个结构体数组,用于存放10个同学的姓名、三门课的成绩及平均分; (2)在键盘上读入10个同学的姓名、三门课的成绩,然后计算每个同学的平均分; (3)将10个同学的姓名、三门课的成绩及平均分写入到文本文件aa.txt中;,程序如下: #include “stdio.h“ #include “process.h“ /*定义结构体*/ struct stu char 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(“请输入十个学生的数据n“); /*输入十个同学的姓名、成绩并计算每个同学的平均分*/ for(i=0;iname, /关闭文件 ,输入的数据如下:,打开件aa.txt,【例8-3】将上例中的文本文件aa.txt数据读出,并将读出的数据输出在显示器上。,分析: (1)定义一个结构体数组,用以存放读出的数据; (2)以只读的形式打开文件文件aa.txt; (3)将文本文件aa.txt中的数据读入到结构体数组中; (4)在显示器上输出此数组;,#include “stdio.h“ #include “process.h” /*有exit()函数,所有用此库函数*/ /*定义结构体*/ struct stu char 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, ,显然,输出的结果就是上例中的数据。,2. fread()函数、fwrite()函数,将一组数据,如一个数组元素,一个结构变量的值等一次性读写,其输入输出函数是二进制形式输入输出的函数,在输入输出中不必进行数据的转换,输入输出速度相对较快。,读写数据块函数调用的一般形式为: fread(buffer,size,count,fp); fwrite(buffer,size,count,fp); 说明: buffer:对于fread()来说,指的是 读入数据的存放地址; 对于fwrite来说,是要输出数据的地址。 size读写数据时,每笔数据的大小 count: 读写数据的笔数 fp: 文件指针,for(i=0;iname,fread(yy,sizeof(struct stu),10,fp);,for(i=0;iname,pp-math,pp-englist,pp-chinese,pp-avg);,fwrite(pp,sizeof(struct stu),10,fp);,用fread()、fwrite()函数将【例8-2】【例8-3】合成后的程序如下,#include “stdio.h“ #include “process.h“ struct stu char 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(i=0;iname,yy=ss; /*一次性读入十个同学的数据*/ fread(yy,sizeof(struct stu),10,fp); /*在显示器上显示结果*/ printf(“文件读出后的数据为:n“); for(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文件中查找该学生,找到以后输出该学生的所有数据,如果文件中没有输入的姓名,给出相应的提示信息。,分析: (1)要打开文件aa.txt (2)输入要查找的姓名 (3)读一条记录,检查此记录中的姓名是否与要查找的姓名一致,若一致,则输 出此记录。 (4)如果不是文件尾,则一直重复(3) (5)如果记录全查遍,无此记录,则输出相应信息。,#include “stdio.h“ #include “process.h“ #include “string.h“ struct stu char 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(“请输入要查找的姓名:“); gets(nn);,while(!feof(fp) fscanf(fp,“%s%d%d%d%f“,studenti.name, ,任务2 将学生成绩随机读写到文件中,一、问题情景 从键盘中输入一个班40个学生的姓名及数学、英语、语文三门课的成绩,计算每个同学的平均分,然后将此40个同学的姓名、三门课的成绩及平均分写入到文本文件aa.txt中;再从文件中读取第 2, 4,6,8,10 个学生的数据并输出在显示器上。 分析:例8-2、例8-3中的文件读入和写入都是顺序读写,而本任务中的问题是要求随机读写,即按要求进行读写。换句话说,就是人为的控制当前文件指针的移动,让文件指针随意指向我们想要指向的位置,而不是像以往那样按物理顺序逐个移动,这就是所谓对文件的定位与随机读写。,二、具体实现(为了程序运行方便,所以假设只有10个学生),#include “stdio.h“ #include “process.h“ struct stu char 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(i=0;iname, ,知识点是: 1、文件的定位; 2、文件的随机读写;,三、相关知识,所谓随机读写,是指读完上一个字符(字节)后,并不一定要读写其后续的字符(字节),而可以读写文件中任意位置上所需要的字符(字节)。,指针指向文件开头的函数(rewind()函数) 调用的形式:rewind(文件指针) 功能:将文件指针重新移动到文件开头的位置,2. fseek()函数 fseek(文件指针, 位移量, 起始点); 功能:用来移动文件内部位置指针 位移量,可以为正数也可以为负数,如果为正数,指针向地址高的方向移动,如果为负数,指针向地址低的方向移动,若位移量为常数,要求加后缀L; 起始点必须是0,1,2中的一个,分别代表以下三个符号常量 起始点 表示符号 含义 0 SEEK_SET 文件开始 1 SEEK_CUR 当前文件指针位置 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门课的成绩,保存到一个名为ddd.dat的二进制文件中去,然后在ddd.dat文件中读出第三个学生的数据。,分析:编写此题的思路是: (1)需要定义一个结构体数组,用于存放5个同学的姓名、三门课的成绩; (2)在键盘上读入5个同学的姓名、三门课的成绩5; (3)以读写的形式打开二制文件ddd.dat,将5个同学的姓名、三门课的成绩写入到文件中; (4)将ddd.dat文件位置指针移到文件首,然后移动文件位置指针,将它定位在第三条记录上,将数据读入并显示在显示器上; (5)关闭文件;,程序如下: #include “stdio.h“ #include “process.h” /*有exit()函数,所有用此库函数*/ #define N 5 struct stu char 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,以读写的形式打开文件,将文件位置指针移动文件首,从文件头开始,移动文件位置指针到第三位,任务3 举一反三,【例8-6】从键盘上输入10个整数,分别以文本文件和二进制文件方式存入磁盘。 分析:要打开二个文件,一个文件以文本文件方式存入磁盘,另一个文件以二进制方式存入磁盘,分别用fprintf()函数和fwrite()函数写入,程序如下: #include “stdio.h“ #define N 10 main() int x10,i,y10; FILE *fp1,*fp2; fp1=fopen(“d1.txt“,“w+“); fp2=fopen(“d2.dat“,“wb+“); printf(“请输入%d个数:n“,N); for(i=0;iN;i+) scanf(“%d“, ,将键盘中输入的数写入到文本文件d1.dat中;,一次性写入数据到二进制文件d2.dat中,【例8-7】从上例中的文件d1.txt及d2.dat中读出并显示在显示器上。,分析:要打开二个文件,一个文件以文本文件方式读入内存,另一个文件以二进制方式读入内存,分别用fscanf()函数和fread()函数读入。,程序如下: #include “stdio.h“ #define N 10 main() int x10,i,y10; FILE *fp1,*fp2; fp1=fopen(“d1.txt“,“r+“); fp2=fopen(“d2.dat“,“rb+“); for(i=0;iN;i+) fscanf(fp1,“%d“,for(i=0;iN;i+) printf(“%5d“,xi); printf(“n“); fclose(fp1); fclose(fp2); ,将文件d1.txt读入到数组y中,将文件d2.dat读入到数组x中,【例8-8】将d2.dat中的1、3、5、7、9数据读出并显示在显示器上,#include “stdio.h“ #define N 10 main() int x,i; FILE *fp2; fp2=fopen(“d2.dat“,“rb+“); for(i=0;iN;i=i+2) fseek(fp2,i*sizeof(int),0); fread( ,在文件中定位并将此数读出,同时显示在屏幕上,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!