模块八 文件操作训练 电子教案(表格式) C语言程序设计(高教版)

资源下载
  1. 二一教育资源

模块八 文件操作训练 电子教案(表格式) C语言程序设计(高教版)

资源简介

第3章 面向对象(上)
模块八 文件操作训练
职业本科规划教材
《C语言程序设计》
教学设计
课程名称: C语言程序设计
授课年级: 2022年级
授课学期: 2022学年第一学期
教师姓名: XXX
2021年10月22日
课题名称 模块八 文件操作训练 计划学时 8学时
内容分析 文件是计算机经常使用的一个重要内容。C语言实现文件操作主要有两种途径:其一是通过操作系统完成对文件的输入输出操作;其二是通过由C语言的编译系统提供的一套用于文件操作的库函数。
教学目标及基本要求 (1) 掌握文件类型指针的概念;(2) 掌握文件的打开与关闭;(3) 掌握字符读写函数(fgetc函数和fputc函数);(4) 理解数据块读写函数(fread函数和fwrite函数);(5) 了解格式读写函数(fscanf函数和fprintf函数)。
教学重点 文件类型指针、文件的打开与关闭、字符读写函数
教学难点 文件的打开与关闭、字符读写
教学方式 教学采用教师课堂讲授与学生操作练习共同进行的一体化教学方式概念性知识点:提出为什么,将抽象具体化,配合教学PPT、案例辅助讲解。操作性知识点:提需求,并上机演示如何操作,重点内容总结经验及注意事项。学生操作练习:完成教材中的引例、做中学以及练中学案例,有能力的学生还可以完成教师额外布置的拓展练习题目。
教学过程 第一、二学时(C语言的文件系统、文件的打开与关闭)一、引例任务,提出需求(1)通过引力任务,引出本节所需知识内容。【引例任务】文本文件的读取。【程序代码】#include void main( ){ FILE *fp1; char file[100]; char b[1000]; printf("要读取文本文件!请输入文件名:"); scanf("%s",file); if((fp1=fopen(file,"r"))==NULL) {/*判断文件打开操作是否失败*/ printf("不能打开此文件。\n"); return; } do{ fscanf(fp1,"%s,",b); printf("%s\n",b); }while(!feof(fp1)); printf("------读取完毕------\n"); fclose(fp1);}【程序运行】要读取文本文件!请输入文件名:x.txt↙89,-21,0,7.8,8.9,0,571,-9.8,0,45.882,-8.912,243,0,-56.243------读取完毕------(2)明确学习方向。【知识点】文件内容的存储缓冲文件系统文件的打开文件的关闭【能力点】了解文件系统掌握文件的打开与关闭明确目标,完成任务文件内容的存储形式根据数据的组织形式,C语言文件系统把文件分为ASCII码文件和二进制文件。ASCII码文件又称为文本文件,它的每一B存放一个ASCII码,代表一个字符;二进制文件则把内存中的数据按其在内存中的存储形式按原样输出到磁盘上,即它的每一B存放一个二进制数据。使用文本文件存储数值型数据时需要将计算机内存中的数据由二进制转换为多个ASCII码,而且会占据较多的磁盘存储空间;而使用二进制文件存储就不必进行转换并且可以节省磁盘存储空间。但由于文本文件便于显示,便于用户直接读写,因而较多用于保存最终运行结果;而二进制文件则多用于保存中间结果、原始数据。C语言文件系统中的文件实际上是一个字符流或者二进制流,也称为流式文件。在C语言中对文件的存取都是以字节为单位进行的,文件的输入输出受程序的控制。C文件系统将文件简单地看作是字节(字符)的序列,即文件是由一个一个的字节(ASCII字符)数据顺序组成,最后一般用一个文件结束标记来结束。缓冲文件系统ANSI C标准规定,采用缓冲文件系统来处理文件,即无论是文本文件,还是二进制文件,都使用缓冲文件系统来处理。对于缓冲文件系统,可执行程序读取数据时,是从缓冲区中读取数据,当缓冲区中的数据被读完后,文件系统才读取磁盘中文件的数据,以供可执行程序读取。同理,可执行程序写入数据,也是向缓冲区写入数据,当缓冲区被数据写满后,文件系统才将缓冲区中的数据写入磁盘中文件。文件的打开C语言中使用fopen函数来打开文件。语法格式为FTLE * fopen ( char * filename,char * mode);函数fopen的第一个参数filename是要打开文件的文件名,该参数可以为字符串、字符数组名或者指向字符串的指针;函数fopen的第二个参数mode是使用文件的存取方式。C文件系统中还包含3个通常与终端相联系的标准文件,即标准输入、标准输出和标准出错输出。在程序开始运行时,系统自动打开这3个文件,并由系统自动定义3个文件指针stdin、stdout和stderr,分别指向终端输入、终端输出和标准错误输出(一般也从终端stdout输出)。文件的关闭在缓冲文件系统中,向文件写数据时,首先将数据输出到缓冲区,待缓冲区满后才将数据一起输出给文件。如果使用文件后没有关闭文件,并且此时文件缓冲区未满,那么系统将不会把缓冲区中的数据输出到磁盘文件;如果恰好此时程序运行结束,那么缓冲区中的数据就会丢失。为了避免这个问题,同时也为了保证释放内存并且防止该文件再次被误用,使用完文件后一定要关闭文件。在C语言中使用fclose函数来实现关闭文件的操作。函数调用的语法格式为: int fclose(FILE *fp);fp为指向待关闭文件的指针。如果关闭操作成功,fclose函数将返回0,否则返回EOF(stdio.h中定义的符号常量,其值为-1)。fclose函数在关闭文件时,首先将缓冲区中没有写入磁盘文件的数据写入到磁盘文件,然后释放文件指针变量,即将文件所占据的内存区域释放并归还给操作系统。三、归纳总结,布置课后作业 (1)回顾上课前的学习目标,对本节课知识点进行总结。 (2)扫描二维码查看相应资源,完成课后实训题。第三、四、五学时(文件的读写)一、引入学习任务(1)回顾上节课的内容,C语言的文件系统、文件的打开与关闭。(2)明确学习方向。【知识点】字符读写函数数据库读写函数格式读写函数【能力点】掌握字符读写函数(fgetc函数和fputc函数)理解数据块读写函数(fread函数和fwrite函数)了解格式读写函数(fscanf函数和fprintf函数)二、明确目标,完成任务打开文件后,就可以使用C语言提供的读写函数对文件进行读写。在C语言中包含字符读写、数据读写、格式读写、字(整数)读写和字符串读写等操作。字符读写函数fputc( )函数的作用是把一个字符输出到指定文件中去,而fgetc( )函数的作用是从指定的文件中读入一个字符。这两个函数一般用来读写文本文件。【做中学8-1】从键盘输入些字符,把它们保存到文件中,直至输入“#”为止,然后再从屏幕输出文件内容。【程序代码】 #include void main( ){ FILE *fp; char ch,file[20]; printf("请输入新建文件的文件名:"); scanf("%s",file); if((fp=fopen(file,"w"))==NULL) { /*判断文件打开操作是否失败*/ printf("不能打开此文件。\n"); } else { printf("请输入文件内容:\n"); ch=getchar( ); /*用来接收上面输入文件名时输入的回车符*/ ch=getchar( ); /*读取键盘输入的符*/ while (ch!='#') { fputc(ch,fp); /*将字符输送到文件fp*/ ch=getchar( ); /*继续读取键盘输入的符*/ } fclose(fp); } printf("你输入的文件内容为:\n"); if((fp=fopen(file,"r"))==NULL) { /*判断文件打开操作是否失败*/ printf("不能打开此文件。\n"); } else{ char ch; ch=fgetc(fp); /*读取f中的符*/ while (!feof(fp)){ putchar(ch); /*将字符输送到终端*/ ch=fgetc(fp); /*继续读取f中的符*/ } fclose(fp); } printf("\n");}1)fputc函数fputc函数的语法格式为: int fputc(char ch, FILE * fp);2)fgetc( )函数fgetc函数的语法格式为: int fgetc(FILE * fp);3)判断文件读结束函数符号常量EOF只能用来判断一个文本文件的读结束,不能用来判断二进制文件的读结束。为此,ANSI C提供了一个用于判断文件是否结束的函数feof,该函数的语法格式为 int feof(FILE * fp);数据块读写函数fread和fwrite函数用来实现一次输入输出一组数据。fread函数用来从文件读取一个数据块,fwrite函数则用来向一个文件输出数据块。这两个函数一般用来读写二进制文件。【做中学8-2】将已赋值的浮点型数组元素数据存到文件里,然后从该文件中读取数据输出到终端。【程序代码】 #include void main( ){ FILE *fp; float a[3][10],b=3.1286f; int i,j; char file[20]; for (i=0;i<3;i++) for (j=0;j<10;j++) a[i][j]=(i+1)*(j+1)*b; printf("现在要存储数据!请输入文件名:"); scanf("%s",file); if((fp=fopen(file,"wb"))==NULL) { /*判断文件打开操作是否失败*/ printf("不能打开此文件。\n"); } else{ for (i=0;i<3;i++) fwrite(a+i,4,10,fp); /*4为每个数组元素的字节数,写10个元素*/ fclose(fp); } for (i=0;i<3;i++) for (j=0;j<10;j++) a[i][j]=0; printf("现在准备读取数据!请输入文件名:"); scanf("%s",file); if((fp=fopen(file,"rb"))==NULL) { /*判断文件打开操作是否失败*/ printf("不能打开此文件。\n"); } else{ for (i=0;i<3;i++) fread(a+i,4,10,fp); /*4为每个数组元素的字节数,读10个元素*/ for (i=0;i<3;i++){ for (j=0;j<10;j++) printf("%6.2f ",a[i][j]); printf("\n"); } } printf("\n");}1)fread函数语法格式为: int fread ( char *buffer,unsigned size ,unsigned count,FILE * fp);2)fwrite函数语法格式为: int fwrite ( char *buffer, unsigned size , unsigned count, FlLE *fp);格式读写函数fprintf函数和fscanf函数用来进行格式化输入输出。这两个函数与标准格式化输入输出函数printf和scanf相仿,只不过printf函数和scanf函数的读写对象不是磁盘文件而是终端设备。【做中学8-3】 有一数据文件内容如下,编写程序统计并输出该文件中正数、负数和零的个数。89,-21,0,7.8,8.9,0,571,-9.8,0,45.882,-8.912,243,0,-56.243【程序代码】 #include void main( ){ FILE *fp; float b; int n1=0,n2=0,n3=0; char fname[20]; printf("读取数据文件!请输入文件名:"); scanf("%s",&fname); if((fp=fopen(fname,"r"))==NULL) { /*判断文件打开操作是否失败*/ printf("不能打开此文件。\n"); } else{ fscanf(fp,"%f,",&b); while(!feof(fp)){ if (b==0) n2++; else if (b<0) n1++; else if (b>0)n3++; printf("%6.3f\t",b); fscanf(fp,"%f,",&b); } fclose(fp); } printf("\n负数:%d个。零:%d个。正数:%d个。\n",n1,n2,n3);}1)fprintf函数语法格式为: int fprintf(FlLE *fp,char * format,args,…);2)fscanf函数语法格式为:int fscanf(FILE *fp ,char format,args,…);三、归纳总结,布置课后作业 (1)回顾上课前的学习目标,对本节课知识点进行总结。 (2)扫描二维码查看相应资源,完成课后作业。第六、七、八学时(边学边练、实训题)一、上机练习【能力点】掌握文件“打开→读写→关闭”的顺序流程掌握数据块读写函数(fread函数和fwrite函数)的使用掌握格式读写函数(fscanf函数和fprintf函数)的使用【练中学8-1】设计一个程序对学生的成绩进行输入、显示和修改,学生档案存入磁盘文件。【程序代码】#include "stdio.h"#include "string.h"#define RS 5 /*程序处理RS个人的信息,根据实际情况RS可以改变*/#define KM 3 /*程序处理KM科的成绩,根据实际情况KM可以改变*/struct st{ int num; char classname[10]; char name[20]; char sex[3]; float score[KM];}student[RS]=`0`; /*定义结构体数组student*/void addst(struct st stu[]){ int i; struct st *p; p=stu; while(p->num!=0) p++; /*查找可存储数据的结构体数组元素*/ printf("请输入班级、学号、姓名、性别、%d门课成绩:\n",KM);do{ scanf("%s",(*p).classname); if (strcmp((*p).classname,"end")!=0){/*班级名称为"end"结束录入*/ scanf("%d%s%s ",&(*p).num,(*p).name,(*p).sex); for (i=0;inum!=0) p++; /*查找可存储数据的结构体数组元素*/ }while(strcmp((*p).classname,"end"));}void displayst(struct st stu[]){ int i,k; struct st *p; p=stu; printf("*****************成绩单*****************"); printf("\n班级\t学号\t姓名\t性别\t各科成绩"); for(k=0;knum!=0){ printf("\n%s\t",(*p).classname); printf("%d\t",(*p).num); printf("%s\t",(*p).name); printf("%s\t",(*p).sex); for (i=0;inum!=0){ fprintf(fp,"\n%s ",(*p).classname); fprintf(fp,"%d ",(*p).num); fprintf(fp,"%s ",(*p).name); fprintf(fp,"%s ",(*p).sex); for (i=0;inum!=n) p++; printf("请输入班级、学号、姓名、性别、%d门课成绩:\n",KM); scanf("%s%d %s%s ",(*p).classname,&(*p).num,(*p).name,(*p).sex); for (i=0;ivoid main( ){ long k; FILE *fp1,*fp2; char file[100]; printf("要读取数据!请输入文件名:"); scanf("%s",file); if((fp1=fopen(file,"rb"))==NULL) { /*判断文件打开操作是否失败*/ printf("不能打开此文件。\n"); return; } printf("要存储数据!请输入文件名:"); scanf("%s",&file); if((fp2=fopen(file,"wb"))==NULL) { /*判断文件打开操作是否失败*/ printf("不能打开此文件。\n"); return; } do{ k=fread(file,1,100,fp1); fwrite(file,1,k,fp2); }while(!feof(fp1)); printf("拷贝完毕。\n"); fclose(fp1); fclose(fp2);}二、归纳总结,完成课后实训题 (1)回顾本节课的学习目标,对知识点进行总结。 (2)完成课后实训作业。
教学后记
2

展开更多......

收起↑

资源预览