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

下载本文档

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

文档简介

1、会计学1C语言程序设计语言程序设计(chn x sh j)项目八项目八第一页,共17页。(一一)文件的打开关闭。文件的打开关闭。1. 文件的概念文件的概念所谓所谓“文件文件”是指记录在外部介质上的数据的有序集合是指记录在外部介质上的数据的有序集合(jh)。从文件的编码方式来看,文件可分为。从文件的编码方式来看,文件可分为ASCII码文件和二进制码文件两种。码文件和二进制码文件两种。2. 文件类型指针文件类型指针FILE *指针变量标识符;指针变量标识符;例如:例如:FILE *p;习惯上笼统地把习惯上笼统地把p称为指向一个文件的指针。称为指向一个文件的指针。在进行读写操作之前要先打开文件,使用

2、完毕要关闭文件。在进行读写操作之前要先打开文件,使用完毕要关闭文件。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

3、;if (fp=fopen(“d:aa.dat”,”r”)=NULL)printf(“n cant open file!”);exit(1)第1页/共17页第二页,共17页。(二二) 文件的读写文件的读写fprintf()函数和函数和fscanf()函数函数调用格式:调用格式:fscanf(文件指针文件指针(zhzhn),格式字符串,输入表列,格式字符串,输入表列)fprintf(文件指针文件指针(zhzhn),格式字符串,输出表列,格式字符串,输出表列)例如(lr): fscantf(p,”%d,%f”,&a,&b); fprintf(p,”%d,%f”,a,b);#incl

4、ude 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); /*将aaa.txt文件中的数据读入到数组b中*/for(i=0;i10;i+)fscanf(p,%d,&bi);/*输出数组b*/for(i=0;i10;i+)printf(%3d,bi);fclose(p)

5、;分析问题情景中的分析问题情景中的C程序程序 第2页/共17页第三页,共17页。【例8-1】从键盘中输入一个学生(xu sheng)的姓名及数学、英语、语文三门课的成绩,计算这个同学的平均分,然后将此同学的有关信息写入到文件cc.txt中;再把cc.txt文件中的数据读入并输出。分析:(1)需要定义一个字符数组存放姓名,三个整型变量存放三门(sn mn)课的成绩,一个实型变量用来存用平均分;(2)在键盘上读入此同学的姓名、三门(sn mn)课的成绩,并计算平均分;(3)将姓名、三门(sn mn)课的成绩、平均分写入到以写入形式打开的文本文件cc.txt中,然后关闭此文件;(4)将cc.txt

6、文件以只读的形式打开后,将此文件中的数据读入到指定的变量中;(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);/*输入该同学的姓名(xngmng)、成绩并计算该同学的平

7、均分*/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);/*以读入的形式打开文件cc.txt*/if(fp=fopen(cc.txt,r)=NULL)printf(打不开文件n);exit(1);/*将该同学的姓名、三门课成绩、平均分读入到指定的变量中*/fsca

8、nf(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);第3页/共17页第四页,共17页。【例8-2】从键盘中输入(shr)10个学生的姓名及数学、英语、语文三门课的成绩,计算每个同学的平均分,然后将此10个同学的姓名、三门课的成绩及平均分写入到文本文件aa.txt中。分析:编写此题的思路是:(1)需要定义一个结构体数组,用于存放10个同学的姓名、三门(sn mn)课的成绩及

9、平均分;(2)在键盘上读入10个同学的姓名、三门(sn mn)课的成绩,然后计算每个同学的平均分;(3)将10个同学的姓名、三门(sn mn)课的成绩及平均分写入到文本文件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;/*以写入的形式(xngsh)打开文件aa.txt*/if(fp=fopen(aa.txt,w)=N

10、ULL)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中中*/for(i=0;iname,pp-math,pp-englis

11、h,pp-chinese,pp-avg);fclose(fp); /关闭文件输入的数据如下:打开件aa.txt 第4页/共17页第五页,共17页。分析:(1)定义一个结构体数组,用以存放读出的数据;(2)以只读的形式打开文件(wnjin)文件(wnjin)aa.txt;(3)将文本文件(wnjin)aa.txt中的数据读入到结构体数组中;(4)在显示器上输出此数组;#include stdio.h#include “process.h” /*有exit()函数,所有用此库函数*/*定义结构体*/struct stuchar name10;int math,english,chinese;flo

12、at avg;main()stu student10,*pp;int i;FILE *fp;/*以读入的形式(xngsh)打开文件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(fp);pp=student;/*输出结构体数组student*/printf(从文件aa

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

14、于:对于fread()来说,指的是来说,指的是 读入数据的存放地址;读入数据的存放地址; 对于对于fwrite来说,是要输出来说,是要输出(shch)数据的地址。数据的地址。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

15、,pp-avg);fwrite(pp,sizeof(struct stu),10,fp);第6页/共17页第七页,共17页。#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(打不开文件(wnjin)n);exit(1);printf(请输入(shr)十个学生的数据n);for(

16、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(文件读出后的数

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

18、件中没有输入的姓名,给出相应的提示信息。分析:(1)要打开文件aa.txt(2)输入要查找的姓名(3)读一条记录,检查此记录中的姓名是否与要查找的姓名一致,若一致,则输 出此记录。 (4)如果不是文件尾,则一直重复(3)(5)如果记录全查遍,无此记录,则输出相应信息。第8页/共17页第九页,共17页。#include stdio.h#include process.h#include string.hstruct stuchar name10;int math,english,chinese;float avg;main()stu student10,*pp,ss10,*yy;char nn1

19、0;FILE *fp;int i;i=0;fp=fopen(aa.txt,r);printf(请输入(shr)要查找的姓名:);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.eng

20、lish,studenti.chinese,studenti.avg);break;i+;if (i=10) printf(对不起,查无此人!n); fclose(fp);第9页/共17页第十页,共17页。一、问题情景一、问题情景 从键盘中输入一个班从键盘中输入一个班40个学生的姓名及数学、英语、语文三门课的成绩,计算每个同学的平均分,然后将此个学生的姓名及数学、英语、语文三门课的成绩,计算每个同学的平均分,然后将此40个同学的姓名、三门课的成绩及平均分写入到文本文件个同学的姓名、三门课的成绩及平均分写入到文本文件aa.txt中;再从文件中读取第中;再从文件中读取第 2, 4,6,8,10 个

21、学生的数据并输出在显示器上。个学生的数据并输出在显示器上。分析:例分析:例8-2、例、例8-3中的文件读入和写入都是顺序读写,而本任务中的问题是要求随机读写,即按要求进行读写。换句话说,就是人为的控制当前文件指针的移动,让文件指针随意指向我们想要指向的位置,而不是像以往中的文件读入和写入都是顺序读写,而本任务中的问题是要求随机读写,即按要求进行读写。换句话说,就是人为的控制当前文件指针的移动,让文件指针随意指向我们想要指向的位置,而不是像以往(ywng)那样按物理顺序逐个移动,这就是所谓对文件的定位与随机读写。那样按物理顺序逐个移动,这就是所谓对文件的定位与随机读写。第10页/共17页第十一页

22、,共17页。#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(打不开文件(wnjin)n);exit(1);printf(请输入(shr)十个学生的数据n);for(i=0;iname,&pp-math,&pp-englist,&pp-chinese);

23、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、文件的随机读写;、文件的随机读写;第11页/共17页第十二页,共17页。所谓随机读写,是指读完上一个字符(字节)后,并不一定要读写其后续的字符(字节),而可以读写文件中任意(rny)位置上所需要的字符(字节)

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

25、含义 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个字节的位置。第12页/共17页第十三页,共17页。

26、【例8-5】有5个学生,每个学生有3门课的成绩,从键盘上分别(fnbi)输入每个学生的学号、姓名、和3门课的成绩,保存到一个名为ddd.dat的二进制文件中去,然后在ddd.dat文件中读出第三个学生的数据。分析:编写此题的思路是:(1)需要定义一个结构体数组,用于存放5个同学的姓名、三门课的成绩;(2)在键盘上读入5个同学的姓名、三门课的成绩5;(3)以读写的形式打开二制文件(wnjin)ddd.dat,将5个同学的姓名、三门课的成绩写入到文件(wnjin)中;(4)将ddd.dat文件(wnjin)位置指针移到文件(wnjin)首,然后移动文件(wnjin)位置指针,将它定位在第三条记录上

27、,将数据读入并显示在显示器上;(5)关闭文件(wnjin);程序(chngx)如下:#include stdio.h#include “process.h” /*有exit()函数,所有用此库函数*/#define 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,&

28、amp;pp-math,&pp-englist,&pp-chinese);pp=student;fwrite(pp,sizeof(struct stu),5,fp);rewind(fp); fseek(fp,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);以读写的形式打开文件以读写的形式打开文件将文件位置指针移动文件首将文件位置指针移动文件首 从文件头开始,移动文件位置指针到第三位从文件头开始,移动文件位置指针到第三位第13页/共17页第十四页,共17页。【例8-6】从键盘上输入10个整数,分别以文本文件和二进制文件方式存入磁盘。分析:要打开二个文件,一个(y )文件以文本文件方式存入磁盘,另一个(y )文件以二进制方式存入磁盘,分别用fprintf()函数和fwrite()函数写入 程序(chngx)如下:#include stdio.h#define N 10main() in

温馨提示

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

评论

0/150

提交评论