版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
9.3文件的读写函数教学设计中职信息技术(信息科技)编程语言基础——C语言(第5版)高教版科目Xx授课时间节次--年—月—日(星期——)第—节指导教师张老师授课班级、授课课时2025年12月授课题目(包括教材及章节名称)设计思路一、设计思路以任务驱动为主线,结合“学生成绩文件管理”案例,先讲文件打开关闭函数fopen/fclose,再依次讲解字符读写(fgetc/fputc)、格式化读写(fscanf/fprintf)、块读写(fread/fwrite)函数,通过教师演示、分组实践,引导学生掌握函数用法及错误处理,强化数据存储与读取的实际应用能力,培养规范编程习惯。核心素养目标二、核心素养目标培养计算思维,通过文件读写函数设计,提升逻辑分析与问题解决能力;增强信息意识,理解文件存储对数据管理的重要性,学会合理组织与调用文件数据;发展数字化学习与创新,运用fopen、fread等函数解决实际编程问题,如学生成绩文件管理;树立信息社会责任,规范文件操作流程,保障数据安全与完整。学情分析中职信息技术专业学生编程基础薄弱,对C语言文件操作概念陌生,但已掌握基本输入输出函数(printf/scanf),具备初步编程思维。学生层次差异明显,部分学生能理解文件指针概念,多数学生对缓冲区机制、文件打开模式等抽象内容理解困难。动手实践能力较强,但常忽视错误处理(如fopen返回值检查),代码规范性不足。学习习惯偏向模仿操作,缺乏主动调试和错误分析能力,导致文件读写任务中易出现数据丢失或程序崩溃。学生对实际应用(如成绩管理)兴趣较高,但抽象理论接受度低,需结合实例强化理解,避免因基础不牢影响后续数据库等课程学习。教学资源-软硬件资源:计算机教室、C语言编译器(如Dev-C++)、投影仪。
-课程平台:校内教学管理系统。
-信息化资源:电子课本、在线编程练习平台、多媒体课件。
-教学手段:教师演示软件、编程调试工具。教学流程1.导入新课(5分钟)
展示学生成绩管理实际问题:教师需将班级30名学生成绩录入程序并保存,下次打开程序时能直接读取历史数据,避免重复输入。提问:“如果用之前学的printf/scanf,关闭程序后数据会丢失吗?如何让数据永久保存?”引导学生思考“持久化存储”,引出文件概念。结合课本第9章引言,说明文件是数据长期存储的载体,文件读写函数是实现数据持久化的关键,点明本节课学习目标:掌握C语言文件读写函数,解决成绩数据保存问题。
2.新课讲授(15分钟)
(1)文件打开与关闭函数fopen/fclose
分析:文件操作需先“打开”建立程序与文件的关联,再“关闭”释放资源。讲解fopen原型:FILE*fopen(constchar*filename,constchar*mode),重点说明mode参数("r"只读、"w"只写、"a"追加、"r+"读写),强调"w"模式会清空原文件内容。举例:以“成绩保存”为目的,用fopen("score.txt","w")创建/打开文件,需判断返回值是否为NULL(避免文件打开失败导致程序崩溃);用fclose(fp)关闭文件,确保数据写入缓冲区。
(2)字符读写函数fgetc/fputc
分析:针对单个字符的读写,fgetc从文件指针当前位置读取一个字符,fputc向文件写入一个字符。讲解函数原型:intfgetc(FILE*stream)、intfputc(intc,FILE*stream)。举例:向score.txt写入字符'A',用fputc('A',fp);再读取并显示,用charch=fgetc(fp),循环读取直到EOF(文件结束标志)。结合课本图9-3(文件读写流程图),说明字符读写逐个操作,适合文本文件简单处理。
(3)格式化读写函数fscanf/fprintf
分析:针对结构化数据(如学生成绩:学号、姓名、分数),使用格式化读写更高效。讲解fscanf(从文件读取格式化数据)和fprintf(向文件写入格式化数据)原型,格式控制符与scanf/printf一致(如"%d%s%f")。举例:定义学生结构体structstudent{intid;charname[20];floatscore;},用fprintf(fp,"%d%s%f",1,"张三",90.5)写入数据;用fscanf(fp,"%d%s%f",&s.id,,&s.score)读取并存储到结构体变量,强调读取时需注意变量地址(&)。
3.实践活动(15分钟)
(1)任务1:文件打开与关闭操作
要求:创建程序,以"w"模式打开文件"data.txt",判断文件指针是否有效,若无效输出"文件打开失败",有效则写入字符串"HelloC!"后关闭文件。举例代码:FILE*fp=fopen("data.txt","w");if(fp==NULL){printf("错误");}else{fputs("HelloC!",fp);fclose(fp);},重点训练错误处理意识(课本9.1节强调文件操作需检查返回值)。
(2)任务2:字符文件复制
要求:用fgetc/fputc实现将"source.txt"内容逐字符复制到"dest.txt"。举例:打开源文件和目标文件,循环用ch=fgetc(fp1),若ch!=EOF则fputc(ch,fp2),直到文件结束。强调EOF的作用(课本9.2节说明EOF是-1,标志文件读取完毕),训练循环控制与文件结束判断。
(3)任务3:学生成绩录入与读取
要求:定义结构体数组存储3名学生成绩,用fprintf将数据写入文件"score.dat",再用fscanf读取并显示在屏幕。举例:写入循环for(i=0;i<3;i++)fprintf(fp,"%d%s%.1f",s[i].id,s[i].name,s[i].score);读取循环for(i=0;i<3;i++)fscanf(fp,"%d%s%f",&s[i].id,s[i].name,&s[i].score),显示printf("学号:%d姓名:%s成绩:%.1f\n",s[i].id,s[i].name,s[i].score)。结合课本9.3节“格式化读写”案例,强化结构化数据存储应用。
4.学生小组讨论(5分钟)
(1)问题1:文件打开模式"r"和"w"有何区别?举例说明。
回答:"r"为只读,要求文件必须存在,不存在则打开失败(如fopen("no.txt","r")返回NULL);"w"为只写,文件不存在则创建,存在则清空空文件(如已有"score.txt"含数据,用"w"打开后原数据丢失)。
(2)问题2:为什么文件操作后必须调用fclose?举例说明。
回答:fclose将缓冲区数据写入文件并释放文件指针资源,避免数据丢失(如程序异常终止时,未关闭的文件可能只保存部分数据)和资源泄漏(如多次打开文件不关闭,导致系统文件句柄耗尽)。
(3)问题3:用fscanf读取文件时,如何跳过空格或换行符?举例说明。
回答:在格式字符串中使用空格跳过空白字符,如"%d%s%f"中%d和%s间的空格会跳过文件中的空格/换行;若需读取含空格的字符串(如姓名"张三"),用"%[^\n]"读取到换行符为止(如fscanf(fp,"%d%[^\n]",&id,name))。
5.总结回顾(5分钟)
梳理本节课重点:①文件打开关闭流程(fopen/fclose+错误处理);②三大读写函数应用场景(字符fgetc/fputc适合简单文本,格式化fscanf/ffprintf适合结构化数据)。难点:文件指针概念(指向文件信息的结构体变量,是文件操作的“句柄”)、模式选择(根据读写需求选"r""w""a"等)。强调错误处理的重要性(如fopen后必须判断fp是否为NULL),举例:若忽略检查,文件打开失败时继续操作会导致程序崩溃。联系实际应用,说明文件读写是数据库、管理系统的基础,为后续学习数据结构课程奠定基础。知识点梳理一、文件基本概念与操作流程
1.文件分类:文本文件(ASCII码,可读性强,如.txt)与二进制文件(二进制数据,存储高效,如.dat),教材9.1节明确二进制文件适合存储结构体、数组等复杂数据。
2.文件指针(FILE*):定义文件类型指针,是文件操作的“句柄”,如FILE*fp,需包含头文件<stdio.h>。
3.操作流程:打开文件(fopen)→读写操作→关闭文件(fclose),缺一不可,教材强调“先打开,后读写,最后关闭”的规范流程。
二、文件打开与关闭函数
1.fopen函数:原型FILE*fopen(constchar*filename,constchar*mode),参数mode决定打开方式:
-"r":只读,文件必须存在,不存在则失败;
-"w":只写,文件不存在则创建,存在则清空;
-"a":追加,文件不存在则创建,存在则在末尾写入;
-"r+":"读写,文件必须存在;
-"w+":读写,文件不存在则创建,存在则清空;
-"a+":读写,文件不存在则创建,存在则在末尾读写;
-二进制模式加"b"(如"rb"、"wb"),教材9.1节指出二进制模式适合非文本数据,避免字符转换问题。
2.错误处理:fopen返回NULL表示失败,需立即检查,如if(fp==NULL){printf("打开失败");exit(1);},避免后续操作崩溃。
3.fclose函数:原型intfclose(FILE*fp),关闭文件并释放缓冲区资源,教材强调“程序结束前必须关闭文件”,否则可能导致数据丢失(缓冲区未写入)或资源泄漏。
三、字符读写函数
1.fputc函数:原型intfputc(intc,FILE*fp),将字符c写入文件指针fp指向的文件,成功返回字符,失败返回EOF,如fputc('A',fp)。
2.fgetc函数:原型intfgetc(FILE*fp),从文件中读取一个字符,返回字符ASCII值,文件结束时返回EOF(值为-1),需循环读取:charch;while((ch=fgetc(fp))!=EOF){putchar(ch);}。
3.应用场景:适合处理文本文件逐字符操作,如加密解密、字符统计,教材9.2节案例“文件字符复制”即采用此函数。
四、格式化读写函数
1.fprintf函数:原型intfprintf(FILE*fp,constchar*format,...),向文件写入格式化数据,用法与printf相同,输出目标改为文件,如fprintf(fp,"%d%s%.1f",1,"张三",90.5)。
2.fscanf函数:原型intfscanf(FILE*fp,constchar*format,...),从文件读取格式化数据,用法与scanf相同,输入源改为文件,如fscanf(fp,"%d%s%f",&id,name,&score),注意变量需取地址。
3.结构体数据读写:定义结构体structstudent{intid;charname[20];floatscore;},用fprintf/fscanf读写数组或单个结构体,如for(i=0;i<3;i++)fprintf(fp,"%d%s%.1f",s[i].id,s[i].name,s[i].score),教材9.3节“学生成绩管理”案例重点应用此函数。
五、块读写函数
1.fread函数:原型size_tfread(void*ptr,size_tsize,size_tcount,FILE*fp),从文件读取count个大小为size的数据块到ptr指向的内存,返回实际读取的数据块数量,如fread(s,sizeof(structstudent),3,fp)读取3个学生结构体到数组s。
2.fwrite函数:原型size_tfwrite(constvoid*ptr,size_tsize,size_tcount,FILE*fp),将内存中count个大小为size的数据块写入文件,返回实际写入的数据块数量,如fwrite(s,sizeof(structstudent),3,fp)将数组s写入文件。
3.二进制文件优势:使用fread/fwrite读写二进制文件时,数据以内存原形式存储,无需转换,读写效率高,适合存储大量结构化数据,教材9.3节对比文本文件与二进制文件,指出二进制文件在数据完整性和存取速度上的优势。
六、文件状态检测与错误处理
1.feof函数:原型intfeof(FILE*fp),检测文件是否结束,返回非0表示结束,常用于循环结束判断,如while(!feof(fp)){fgetc(fp);}。
2.ferror函数:原型intferror(FILE*fp),检测文件读写是否出错,返回非0表示出错,如if(ferror(fp)){printf("读写错误");}。
3.clearerr函数:原型voidclearerr(FILE*fp),清除文件结束标志和错误标志,教材9.4节强调“错误发生后需清除标志,才能继续操作”。
七、文件操作综合应用
1.文件复制:字符复制用fgetc/fputc,二进制文件复制用fread/fwrite,如while((ch=fgetc(fp1))!=EOF){fputc(ch,fp2);}。
2.数据追加:用"a"模式打开文件,避免覆盖原数据,如fopen("score.txt","a")。
3.文件加密:逐字符读取后进行简单加密(如异或运算)再写入,如ch=fgetc(fp);fputc(ch^5,fp_new),体现文件函数的实际应用价值。课后作业1.题目:编写程序,以"w"模式打开文件"test.txt",写入字符串"C语言文件操作",关闭文件后重新以"r"模式打开,读取并显示内容。
答案:
```c
#include<stdio.h>
intmain(){
FILE*fp=fopen("test.txt","w");
if(fp==NULL){printf("打开失败");return0;}
fprintf(fp,"C语言文件操作");
fclose(fp);
fp=fopen("test.txt","r");
charstr[20];
fscanf(fp,"%s",str);
printf("%s",str);
fclose(fp);return0;
}
```
2.题目:使用fgetc/fputc函数将"source.txt"文件内容复制到"dest.txt"。
答案:
```c
#include<stdio.h>
intmain(){
FILE*fp1=fopen("source.txt","r"),*fp2=fopen("dest.txt","w");
if(fp1==NULL||fp2==NULL){printf("打开失败");return0;}
charch;
while((ch=fgetc(fp1))!=EOF)fputc(ch,fp2);
fclose(fp1);fclose(fp2);return0;
}
```
3.题目:定义学生结构体(包含学号、姓名、成绩),用fprintf将3名学生数据写入"score.txt",再用fscanf读取并显示。
答案:
```c
#include<stdio.h>
structstudent{intid;charname[20];floatscore;};
intmain(){
FILE*fp=fopen("score.txt","w");
structstudents[3]={{1,"张三",90},{2,"李四",85},{3,"王五",88}};
for(inti=0;i<3;i++)fprintf(fp,"%d%s%.1f",s[i].id,s[i].name,s[i].score);
fclose(fp);fp=fopen("score.txt","r");
for(inti=0;i<3;i++)fscanf(fp,"%d%s%f",&s[i].id,s[i].name,&s[i].score);
for(inti=0;i<3;i++)printf("学号:%d姓名:%s成绩:%.1f\n",s[i].id,s[i].name,s[i].score);
fclose(fp);return0;
}
```
4.题目:用"fread/fwrite"实现将10个整数写入二进制文件"data.bin",再读取并计算平均值。
答案:
```c
#include<stdio.h>
intmain(){
FILE*fp=fopen("data.bin","wb");
inta[10]={1,2,3,4,5,6,7,8,9,10},sum=0;
fwrite(a,sizeof(int),10,fp);fclose(fp);
fp=fopen("data.bin","rb");
fread(a,sizeof(int),10,fp);
for(inti=0;i<10;i++)sum+=a[i];
printf("平均值:%.1f",sum/10.0);fclose(fp);return0;
}
```
5.题目:编写程序,向"append.txt"文件追加字符串"追加内容",要求保留原文件内容。
答案:
```c
#include<stdio.h>
intmain(){
FILE*fp=fo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论