第9章 第5节:文件应用实例(课件)-《编程语言基础—C语言》(高教版第5版)同步精品课堂

2025-12-29
| 30页
| 104人阅读
| 1人下载
精品

内容正文:

9.5节:文件应用实例 编程语言基础——C语言 同步精品课堂 高教版(第5版) 掌握国家标准《机械制图》中有关图幅、比例、字体图线等基本规定。 教学目标 一 03 能够编写函数完成文件内容的复制操作,包括二进制文件和文本文件 能够综合运用文件操作技术解决实际问题 04 掌握fgets和fputs函数实现文本文件的逐行读写,能够处理字符串输入输出任务 02 能够使用fwrite和fread函数完成浮点数组、结构体等复杂数据的二进制读写操作 01 教学重难点 二 03 不同数据类型的文件处理,包括浮点数组、结构体、字符串等格式的读写转换 综合应用文件操作技术解决实际问题,如通讯录建立中的键盘输入、文件写入、数据读取等环节的整合 04 文件复制函数的编写,掌握源文件与目标文件的打开、读写、关闭流程 02 二进制文件的读写操作,理解fwrite和fread函数的参数设置与数据格式要求 01 导入新课 三 C语言"数据管家"实战挑战 假设你是班级数据管理员,现在需要: 保存全班数学成绩(浮点数组) 记录3位转学生档案(结构体) 收集同学留言(多行文本) 备份重要班级文件 制作平方根速查表 建立班级通讯录 这些任务如果用变量和数组,程序关闭后数据就消失了,怎么办? 今天我们将通过6个实战案例,学习C语言的'数据管家'技能 新知讲授 四 在学习了C语言文件读写的基础知识后,本节将通过多个“文件应用实例”,从二进制数据存储、结构化信息管理到文本文件操作,综合运用读写函数完成数据持久化、文件复制、信息查询与通讯录建立等典型任务,从而加深对文件输入输出技术的整体理解与实际应用能力。 概述 新知讲授 四 知识点1:文件应用实例 例9-4:把一个浮点数组以二进制方式写入文件fc.dat中,再从文件fc.dat中读出并显示。 #include <stdio.h> main( ) { float a [ 6 ] = {15.2, -24.3, 5.04, 0.71, 50.6, 50.5 }; int i, k; float dat [100]; FILE *fp; fp = fopen ("fc.dat", "wb" ); /* 创建一个二进制文件只写 */ if ( fp == NULL ) { printf ( "不能打开文件! " ); return; } fwrite ( a, sizeof ( float ), 6, fp ); /* 将6个浮点数写入文件中 */ fclose ( fp ); fp = fopen ( "fc.dat", "rb" ); if ( fp == NULL ) { printf ( "不能打开文件! " ); return; } k = fread ( dat, sizeof ( float ), 100, fp ) ; /* 返回读取的浮点个数 */ for ( i = 0; i < k; i++ ) printf ( "%7.2f", dat[i] ); fclose ( fp ); } 新知讲授 四 知识点1:文件应用实例 例9-5:将3个学生的记录存入一个磁盘文件fd.dat中,再从文件fd.dat中读出并显示。 # include <stdio.h> #define N 3 #define LEN sizeof( STU ) typedef struct node { char name[10]; int score; } STU; //对结构体进行“别名”声明 main ( ) { FILE *fp; //定义了一个可以指向文件的指针 STU s[ N ]; //定义了一个结构体数组 int i = 0; fp = fopen ( "fd.dat", "wb" ); /* 新建一个二进制文件,磁盘文件名为fd.dat */ printf ( "输入: 姓名\t成绩 " ); ① 新知讲授 四 知识点1:文件应用实例 例9-5:将3个学生的记录存入一个磁盘文件fd.dat中,再从文件fd.dat中读出并显示。 for ( ; i<N; i++ ) { scanf ( "%s%d", s[i].name, &s[i].score ); fwrite ( &s[i], LEN, 1, fp ); /* 将第i个学生记录s[i]写入文件 */ } fclose ( fp ); fp = fopen("fd.dat", "rb" ); /* 以读形式打开一个二进制文件fd.dat */ printf(" 输出: \t姓名 \t 成绩 "); printf("--------------------------------- "); for(i=0; i < N; i++ ) { fread(&s[i], LEN, 1, fp ); /* 从文件中读一个记录存于s[i]中 */ printf(" %10s \t %5d ", s[i].name, s[i].score ); /* 在屏幕上输出s[i]内容 */ } fclose ( fp ); } ② 新知讲授 四 知识点1:文件应用实例 例9-6:从键盘上输入若干行文本(每行不超过80个字符),写到文件fe.txt中,用-1作为字符串输入结束的标志,然后将文件的内容读出并显示在屏幕上。 #include <stdio.h> #include <string.h> int WriteText (char fname[ ] ) /* 写入文件 */ { FILE *fp ; int n=0; char line [ 80 ], *r = "-1"; fp = fopen ( fname, "w" ); /* 以写方式打开文件 */ printf("输入若干行文本,输入 -1 结束。 "); do{ gets ( line ); /* 读入一行 */ if ( strcmp ( line, r ) == 0 ) break; /* 若为串结束标志,则返回 */ fputs ( line, fp ); /* 写入一行 */ fputc ( ' ', fp ); /* 行尾增加换行符 */ n++; } while ( 1 ); fclose ( fp ); return n; } ① 新知讲授 四 知识点1:文件应用实例 例9-6:从键盘上输入若干行文本(每行不超过80个字符),写到文件fe.txt中,用-1作为字符串输入结束的标志,然后将文件的内容读出并显示在屏幕上。 void ReadText ( char fname[ ], int n ) /* 读出文件 */ { char line [80]; int i; FILE *fp; fp = fopen ( fname, "r" ); /* 以读方式打开文件 */ printf(" 输出文件 %s 内容: ", fname ); for ( i=1;i<=n;i++) /* 未到文件结尾 */ { fgets ( line ,80,fp ); /* 读一个字符并显示 */ printf( "%s",line ); } fclose ( fp ); } main( ) { char fname[30]; int n; printf("输入磁盘文件名:"); gets(fname); n=WriteText ( fname ); /* 写文件 */ ReadText (fname,n ); } /* 读文件 */ ② 新知讲授 四 知识点1:文件应用实例 编程1:编写一个函数fun(),其功能是将指定源文件中的内容复制到指定的目标文件中,复制成功时函数返回值为1,失败为0。在复制的过程中,把复制的内容输出到终端屏幕。 文件准备阶段 声明文件指针和状态变量 尝试以读取模式打开源文件 尝试以写入模式打开目标文件 任一文件打开失败则立即终止并返回0 文件复制阶段 使用循环逐个字符读取源文件 每次读取后检查是否到达文件结尾 将读取的字符同时写入目标文件和标准输出 检查每次写入操作是否成功 结果处理阶段 判断复制是否成功完成(正常到达文件结尾) 按正确顺序关闭所有已打开的文件 根据操作结果返回1(成功)或0(失败) 【核心需求】 将源文件内容完整复制到目标文件,同时实时显示复制内容 【关键点】 必须实现精确的字节级复制 需要在复制过程中实时输出到屏幕 需要正确处理文件打开、读写、关闭的所有可能情况 【难点】 确保源文件和目标文件都能正常打开 处理读写过程中可能出现的错误 保证文件完全关闭,避免资源泄露 新知讲授 四 知识点1:文件应用实例 编程1:编写一个函数fun(),其功能是将指定源文件中的内容复制到指定的目标文件中,复制成功时函数返回值为1,失败为0。在复制的过程中,把复制的内容输出到终端屏幕。 #include <stdio.h> int fun(char *source, char *target) { FILE *fp1, *fp2; int ch; //创建并写入源文件 fp1 = fopen("12.txt", "w"); if (fp1 == NULL) return 0; fprintf(fp1, "123456"); fclose(fp1); fp1 = fopen(source, "r"); //复制文件 if (fp1 == NULL) return 0; fp2 = fopen(target, "w"); if (fp2 == NULL) { fclose(fp1); return 0; } printf("输入源文件名: %s ", source); printf("输入目标文件名: %s ", target); while ((ch = fgetc(fp1)) != EOF) { fputc(ch, fp2); putchar(ch); } fclose(fp1); fclose(fp2); return 1; } main() { if (fun("12.txt", "456.txt")) printf(" 文件复制成功! "); else printf(" 文件复制失败! "); printf("请按任意键继续..."); } 新知讲授 四 知识点1:文件应用实例 编程2:编写一个函数fun(),其功能是将自然数1~10以及它们的平方根写到名为“myfilel.txt”的文本文件中,然后再顺序读出显示在屏幕上。 阶段一:数据写入 文件初始化: 以文本写入模式("w")打开文件 写入表头信息 数据生成与写入: 使用for循环生成1到10的自然数 对每个数计算平方根(使用sqrt函数) 使用fprintf格式化写入到文件 每行包含数字和对应平方根 阶段二:数据读取与显示 文件重新打开: 关闭已写入的文件 以文本读取模式("r")重新打开同一文件 内容读取与显示: 逐行读取文件内容 将每行内容直接输出到屏幕 直到读取到文件结束符 新知讲授 四 知识点1:文件应用实例 编程2:编写一个函数fun(),其功能是将自然数1~10以及它们的平方根写到名为“myfilel.txt”的文本文件中,然后再顺序读出显示在屏幕上。 #include <stdio.h> #include <math.h> int fun() { FILE *fp = NULL; int i; double sqrt_val; char buffer[100]; fp = fopen("myfile.txt", "w"); if (fp == NULL) return 0; fprintf(fp, "自然数\t平方根 "); fprintf(fp, "============== "); for (i = 1; i <= 10; i++) { sqrt_val = sqrt(i); fprintf(fp,"%d\t%.6f ",i,sqrt_val); } fclose(fp); printf("从文件读取的内容: "); printf("================ "); fp = fopen("myfile.txt", "r"); if (fp == NULL) return 0; while(fgets(buffer, sizeof(buffer),fp)!=NULL) printf("%s", buffer); fclose(fp); return 1; } main() { int result = fun(); if (result) printf(" 操作成功完成! "); else printf(" 操作失败! "); } 新知讲授 四 知识点1:文件应用实例 编程3:编写函数fun(),其功能是建立班级通讯录。通讯录中记录每位学生的编号、姓名和电话号码。班级人数和学生的信息从键盘读入,每个人的信息作为一个数据块写到名为“myfile2.dat”的二进制文件中。 步骤一:结构定义与文件准备 定义Student结构体包含所需字段 以二进制写入模式("wb")创建文件 获取班级人数作为循环控制变量 步骤二:数据输入与存储 循环收集学生信息: 显示当前输入序号 分别读取编号、姓名、电话号码 验证输入有效性 二进制写入操作: 使用fwrite函数直接写入结构体 每个结构体作为一个完整数据块 检查每次写入是否成功 步骤三:数据验证与显示 文件重新读取: 关闭写入文件流 以二进制读取模式("rb")重新打开文件 内容验证显示: 逐条读取学生记录 格式化显示在屏幕上 验证读取记录数与输入一致 文件信息统计: 计算文件总大小 显示存储的学生数量 确认操作完整性 新知讲授 四 知识点1:文件应用实例 编程3:编写函数fun(),其功能是建立班级通讯录。通讯录中记录每位学生的编号、姓名和电话号码。班级人数和学生的信息从键盘读入,每个人的信息作为一个数据块写到名为“myfile2.dat”的二进制文件中。 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct // 定义学生结构体 { int id; // 编号 char name[50]; // 姓名 char phone[20]; // 电话号码 } Student; main() { int fun(); int result = fun(); if (result) printf(" 通讯录创建成功! "); else printf(" 通讯录创建失败! "); } 新知讲授 四 知识点1:文件应用实例 编程3:编写函数fun(),其功能是建立班级通讯录。通讯录中记录每位学生的编号、姓名和电话号码。班级人数和学生的信息从键盘读入,每个人的信息作为一个数据块写到名为“myfile2.dat”的二进制文件中。 int fun() { FILE *fp = NULL; int n, i; long file_size; Student stu; fp = fopen("myfile2.dat", "wb"); // 打开二进制文件用于写入 if (fp == NULL) { printf("无法创建文件! "); return 0; } printf("请输入班级人数: "); scanf("%d", &n); for (i = 0; i < n; i++) // 输入每个学生的信息 { printf(" --- 第%d个学生信息 --- ", i + 1); printf("请输入学生编号: "); scanf("%d", &stu.id); printf("请输入学生姓名: "); scanf("%s", stu.name); printf("请输入电话号码: "); scanf("%s", stu.phone); if (fwrite(&stu, sizeof(Student), 1, fp) != 1) { printf("写入文件失败! "); fclose(fp); return 0; } } fclose(fp); printf(" === 通讯录内容验证 === "); fp = fopen("myfile2.dat", "rb"); if (fp == NULL){ printf("无法读取文件! "); return 0; } printf("编号\t姓名\t\t电话 "); printf("================================ "); while (fread(&stu, sizeof(Student), 1, fp) == 1) printf("%d\t%s\t\t%s ", stu.id, stu.name, stu.phone); fclose(fp); fp = fopen("myfile2.dat", "rb"); // 显示文件大小信息 fseek(fp, 0, 2); file_size = ftell(fp); fclose(fp); printf(" 文件已创建: myfile2.dat "); printf("文件大小: %ld 字节 ", file_size); printf("记录条数: %d ", n); return 1; } 新知讲授 四 知识点2:文件输入输出小结 文件使用方式 含义 如果指定的文件不存在 “r”(只读) 为了输入数据,打开一个已存在的文本文件 出错 “w”(只写) 为了输出数据,打开一个文本文件 建立新文件 “a”(追加) 向文本文件尾添加数据 出错 “rb”(只读) 为了输入数据,打开一个二进制文件 出错 “wb”(只写) 为了输出数据,打开一个二进制文件 建立新文件 “ab”(追加) 向二进制文件尾添加数据 出错 “r+”(读写) 为了读和写,打开一个文本文件 出错 “rb+”(读写) 为了读和写,打开一个二进制文件 出错 FILE *fp;fp=fopen(文件名,文件使用方式); 新知讲授 四 知识点2:文件输入输出小结 分类 函数名 功能 分类 函数名 功能 打开文件 fopen() 打开文件 文件读写 fgetc() 从指定文件取得一个字符 关闭文件 fclose() 关闭文件 fputc() 把字符输出到指定文件 文件定位 fseek() 改变文件位置指针的位置 fgets() 从指定文件读取字符串 rewind() 使文件位置指针重新置于文件开头 fputs() 把字符串输出到指定文件 ftell() 返回文件位置指针的当前值 fread() 从指定文件中读取数据项 文件状态 feof() 若到文件末尾,函数值为“真”(非0) fwrite() 把数据项写到指定文件 fscanf() 从指定文件按格式输入数据 fprintf 按指定格式将数据写到指定文件中 师生互动 五 【文件操作实战挑战】——班级成绩管理系统 挑战任务 算法分析 请你编写一个C语言程序,实现班级成绩管理系统的以下功能: 从键盘输入5名学生的信息(学号、姓名、C语言成绩) 将学生信息以二进制方式保存到文件"score.dat" 从文件中读取数据并显示所有学生信息 统计并显示班级平均成绩 查询指定学号的学生成绩 定义学生结构体(学号、姓名、成绩) 定义数组存储5名学生信息 用循环从键盘输入数据 用fwrite将数组写入文件 用fread从文件读取数据到数组 计算并显示平均成绩 实现学号查询功能 随堂练习 六 1.使用fopen函数打开文件时,以下模式字符串中不能用于文本文件的是( ) A. "r" B. "w" C. "a" D. "rb+" 答案:D 解析: "rb+"是二进制文件读写模式,文本文件应使用"r+"。 随堂练习 六 2.以下关于fclose函数的描述,错误的是( ) A. 关闭文件时会刷新缓冲区 B. 成功关闭返回0,失败返回EOF C. 程序结束时系统会自动关闭所有文件 D. 关闭文件后文件指针变量变为NULL 答案:D 解析:fclose不会自动将文件指针设为NULL,需要手动设置。 随堂练习 六 3.以下代码的功能是( ) FILE *fp = fopen("data.txt", "a"); A. 以只读方式打开文件 B. 以只写方式打开文件,清空内容 C. 以追加方式打开文件 D. 以读写方式打开文件 答案:C 解析:​ "a"模式表示追加方式,新写入的数据添加到文件末尾。 随堂练习 六 4.以下函数中,不能用于二进制文件的是( ) A. fread B. fwrite C. fgetc D. fscanf 答案:D 解析:fscanf用于格式化读取文本文件,不适合二进制文件。 随堂练习 六 5.使用fwrite函数写入数据时,以下说法正确的是( ) A. 必须按文本格式写入 B. 返回值是实际写入的字节数 C. 必须指定文件位置标记 D. 不能写入结构体数据 答案:B 解析:fwrite返回成功写入的数据项个数,可以写入任何二进制数据。 随堂练习 六 6.以下代码片段的功能是( ) FILE *fp = fopen("data.bin", "rb"); fseek(fp, 0L, SEEK_END); long size = ftell(fp); A. 读取文件内容 B. 获取文件大小 C. 移动文件位置标记 D. 关闭文件 答案:B 解析:先移动到文件末尾,再用ftell获取位置即文件大小。 随堂练习 六 7.以下代码片段的功能是( ) FILE *fp = fopen("data.txt", "r"); char ch; while((ch = fgetc(fp)) != EOF) { putchar(ch); } A. 统计文件字符数 B. 逐字符读取并显示文件内容 C. 查找特定字符 D. 复制文件 答案:B 解析:使用fgetc逐字符读取,putchar输出到屏幕。 随堂练习 六 8.以下代码片段的功能是( ) FILE *fp1 = fopen("src.txt", "r"); FILE *fp2 = fopen("dest.txt", "w"); char ch; while((ch = fgetc(fp1)) != EOF) { fputc(ch, fp2); } A. 比较两个文件 B. 合并两个文件 C. 复制文件内容 D. 删除文件内容 答案:C 解析:从fp1读取字符写入fp2,实现文件复制。 课堂小结 七 谢谢 EV录屏5.4.4软件录制 Lavf58.33.100 本视频由湖南一唯信息科技开发的EV录屏软件录制, www.ieway.cn EV录屏5.4.4软件录制 Lavf58.33.100 本视频由湖南一唯信息科技开发的EV录屏软件录制, www.ieway.cn EV录屏5.4.4软件录制 Lavf58.33.100 本视频由湖南一唯信息科技开发的EV录屏软件录制, www.ieway.cn EV录屏5.4.4软件录制 Lavf58.33.100 本视频由湖南一唯信息科技开发的EV录屏软件录制, www.ieway.cn EV录屏5.4.4软件录制 Lavf58.33.100 本视频由湖南一唯信息科技开发的EV录屏软件录制, www.ieway.cn EV录屏5.4.4软件录制 Lavf58.33.100 本视频由湖南一唯信息科技开发的EV录屏软件录制, www.ieway.cn $

资源预览图

第9章 第5节:文件应用实例(课件)-《编程语言基础—C语言》(高教版第5版)同步精品课堂
1
第9章 第5节:文件应用实例(课件)-《编程语言基础—C语言》(高教版第5版)同步精品课堂
2
第9章 第5节:文件应用实例(课件)-《编程语言基础—C语言》(高教版第5版)同步精品课堂
3
第9章 第5节:文件应用实例(课件)-《编程语言基础—C语言》(高教版第5版)同步精品课堂
4
第9章 第5节:文件应用实例(课件)-《编程语言基础—C语言》(高教版第5版)同步精品课堂
5
第9章 第5节:文件应用实例(课件)-《编程语言基础—C语言》(高教版第5版)同步精品课堂
6
所属专辑
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。