内容正文:
9.3节:文件的读、写函数
编程语言基础——C语言
同步精品课堂
高教版(第5版)
掌握国家标准《机械制图》中有关图幅、比例、字体图线等基本规定。
教学目标
一
03
掌握fread和fwrite函数的功能与格式,能够完成结构体等复杂数据的二进制读写操作
理解fprintf和fscanf函数的格式化特性,能够灵活运用这些函数完成数据的格式化读写任务
04
掌握fgets和fputs函数的特点与参数设置,能够实现字符串的批量读写,正确处理文件中的字符串数据
02
理解fputc和fgetc函数的功能与用法,能够完成字符的逐个读写操作,解决字符复制等基础文件操作问题
01
教学重难点
二
03
格式化读写函数fprintf和fscanf的格式控制字符串设计,以及与标准输入输出函数的区别
不同读写函数的选择与组合使用,理解字符、字符串、二进制数据、格式化数据等不同读写方式的适用场景
04
二进制读写函数fread和fwrite的应用,理解结构体数据的二进制存储方式
02
各文件读写函数的参数格式与返回值含义,特别是fgets函数的缓冲区大小设置问题
01
导入新课
三
C语言"记忆大师"挑战赛
假设你是C语言程序员,现在需要完成以下任务
记录全班50人的期末考试成绩(数据量大)
下次开机后还能查看这些成绩(持久化存储)
能快速找到某位同学的成绩(随机访问)
能把成绩发给老师(数据交换)
问题思考
只用变量和数组能做到吗?为什么需要“文件操作”这个“记忆大师”?
今天我们将学习C语言的四种‘记忆术’:
字符读写(fputc/fgetc)
字符串读写(fgets/fputs)
二进制读写(fread/fwrite)
格式化读写(fprintf/fscanf)
新知讲授
四
文件的读、写功能是程序与外界进行数据持久化交换的核心。本讲将系统学习C语言中用于操作文件的四组核心输入/输出函数,它们分别针对字符、字符串、二进制数据块和格式化数据进行操作,是完成文件创建、写入、读取等任务的基础工具。通过掌握这些函数,我们将能够让程序有效地保存运行结果,并读取已存储的数据。
概述
新知讲授
四
知识点1:fputc函数和fgetc函数
1、fputc函数和fgetc函数
函数名 调用形式 功能 返回值
fgetc fgetc(fp) 从fp指向的文件读入一个字符 读成功,带回所读的字符,失败则返回文件结束标志EOF(即-1)
fputc fputc(ch,fp) 把字符ch写到文件指针变量fp所指向的文件中 输出成功,返回值就是输出的字符;输出失败,则返回EOF(即-1)
新知讲授
四
知识点1:fputc函数和fgetc函数
2、从键盘输入一些字符,并逐个将其送到磁盘上去,直到用户输入一个“#”为止。
#include <stdio.h>
#include <stdlib.h>
main()
{ FILE *fp; //定义文件指针fp
char ch,filename[10];
printf("请输入所用的文件名: ");
scanf("%s",filename); //输入文件名
getchar(); //用来消化最后输入的回车符
if((fp=fopen(filename,"w"))==NULL) //打开输出文件并使fp指向此文件
{ printf("cannot open file
"); //如果打开出错就输出“打不开”
exit(0); } //终止程序
①
新知讲授
四
知识点1:fputc函数和fgetc函数
2、从键盘输入一些字符,并逐个将其送到磁盘上去,直到用户输入一个“#”为止。
printf("请输入一个准备存储到磁盘的字符串(以#结束): ");
ch=getchar(); //接收从键盘输入的第一个字符
while(ch!='#') //当输入′#′时结束循环
{ fputc(ch,fp); //向磁盘文件输出一个字符
putchar(ch); //将输出的字符显示在屏幕上
ch=getchar(); //再接收从键盘输入的一个字符
}
fclose(fp); //关闭文件
putchar('
'); //向屏幕输出一个换行符
}
②
新知讲授
四
知识点1:fputc函数和fgetc函数
3、将一个磁盘文件中的信息复制到另一个磁盘文件中。今要求将上例建立的file1.dat文件中的内容复制到另一个磁盘文件file2.dat中。
#include <stdio.h>
#include <stdlib.h>
main()
{ FILE *in,*out; //定义指向FILE类型文件的指针变量
char ch,infile[10],outfile[10]; //定义两个字符数组,分别存放两个数据文件名
printf("输入读入文件的名字:");
scanf("%s",infile); //输入一个输入文件的名字
printf("输入输出文件的名字:");
scanf("%s",outfile); //输入一个输出文件的名字
if((in=fopen(infile,"r"))==NULL) //打开输入文件
{ printf("无法打开此文件
");
exit(0);
}
①
新知讲授
四
知识点1:fputc函数和fgetc函数
3、将一个磁盘文件中的信息复制到另一个磁盘文件中。今要求将上例建立的file1.dat文件中的内容复制到另一个磁盘文件file2.dat中。
if((out=fopen(outfile,"w"))==NULL) //打开输出文件
{ printf("无法打开此文件
");
exit(0); }
ch=fgetc(in); //从输入文件读入一个字符,赋给变量ch
while(!feof(in)) //如果未遇到输入文件的结束标志
{ fputc(ch,out); //将ch写到输出文件
putchar(ch); //将ch显示到屏幕上
ch=fgetc(in); //再从输入文件读入一个字符,赋给变量ch
}
putchar('\0'); //显示完全部字符后换行
fclose(in); //关闭输入文件
fclose(out); //关闭输出文件
}
②
新知讲授
四
知识点2:fgets函数和fputs函数
1、认识fgets函数和fputs函数
函数名 调用形式 功能 返回值
fgets fgets(str,n,fp) 从fp指向的文件读入一个长度为(n-1)的字符串,存放到字符数组str中 读成功,返回地址str,失败则返回NULL
fputs fputs(str,fp) 把str所指向的字符串写到文件指针变量fp所指向的文件中 输出成功,返回0;否则返回非0值
新知讲授
四
知识点2:fgets函数和fputs函数
1、认识fgets函数和fputs函数
(1)fgets函数的函数原型为:
(2)其作用是从文件读入一个字符串。调用时可以写成下面的形式:
其中,n是要求得到的字符个数,但实际上只从fp所指向的文件中读入n-1个字符,然后在最后加一个′\0′字符,这样得到的字符串共有n个字符,把它们放到字符数组str中。如果在读完n-1个字符之前遇到换行符“
”或文件结束符EOF,读入即结束,但将所遇到的换行符“
”也作为一个字符读入。若执行fgets函数成功,则返回值为str数组首元素的地址,如果一开始就遇到文件尾或读数据出错,则返回NULL。
char *fgets(char *str, int n, FILE *fp);
fgets(str,n,fp);
新知讲授
四
知识点2:fgets函数和fputs函数
例题9-1:用fputs()函数将若干个字符串写入磁盘文件“fa.txt”中,再用fgets()函数读取若干个字符串。
# include <stdio.h>
main( )
{ FILE *fp; /* 定义一个文件指针 */
char a[20], b[20]="123456789abcdef";
fp = fopen ( "ff.txt", "w" ); /* 新建一个文件,磁盘文件名为fa.txt */
fputs ( b,fp);
fputs ( "ABCD012345", fp );
fclose ( fp );
fp = fopen ( "ff.txt", "r" ); /*打开磁盘文件名为fa.txt*/
fgets(a,10,fp); puts(a);
fgets(b,20,fp); puts(b);
fclose ( fp );
}
新知讲授
四
知识点2:fgets函数和fputs函数
例题9-1:用fputs()函数将若干个字符串写入磁盘文件“fa.txt”中,再用fgets()函数读取若干个字符串。
文件名 C语句 文件中的内容存储
fa.txt fputs(b,fp); 1 2 3 4 5 6 7 8 9 a b c d e f
fputs(“ABCD012345”,fp); 1 2 3 4 5 6 7 8 9 a b c d e f A B C 0 1 2 3 4 5
对文件中的内容进行输出
fgets(a,10,fp);puts(a); 123456789
fgets(b,20,fp);puts(b); abcdefABCD012345
新知讲授
四
知识点2:fgets函数和fputs函数
#include <stdio.h>
#include <stdlib.h>
main()
{ FILE*fp;
char str[3][10];
int i=0;
if((fp=fopen("D:\\123\\12.txt","r"))==NULL)//注意文件路径必须与前相同
{ printf("can′t open file!
");
exit(0); }
while(fgets(str[i],10,fp)!=NULL)
{ printf("%s",str[i]);
i++; }
fclose(fp); }
例题:从文件string.dat中读回字符串,并在屏幕上显示。
新知讲授
四
知识点3:fread函数和fwrite函数
C语言允许用fread函数从文件中读一个数据块,用fwrite函数向文件写一个数据块。在读写时是以二进制形式进行的。在向磁盘写数据时,直接将内存中一组数据原封不动、不加转换地复制到磁盘文件上,在读入时也是将磁盘文件中若干字节的内容一批读入内存。
fread(buffer, size, count, fp);
fwrite(buffer, size, count, fp);
buffer: 是一个地址。对fread,它是用来存放从文件读入的数据的存储区的地址。对fwrite,是要把此地址开始的存储区中的数据向文件输出(以上指的是起始地址)。
size: 要读写的字节数。
count: 要读写多少个数据项(每个数据项长度为size)。
fp: FILE类型指针。
float f[10];
fread(f,4,10,fp); //从fp所指向的文件读入10个4个字节的数据,存储到数组f中
新知讲授
四
知识点3:fread函数和fwrite函数
从键盘输入10个学生的有关数据,然后把它们转存到磁盘文件上去。(从磁盘文件stu_list中读入二进制数据,借助结构类型数组stud,输出到stu.dat文件中。)
#include <stdio.h>
#define SIZE 10
struct Student_type
{char name[10];
int num;
int age;
char addr[15];
}stud[SIZE];
void load()
{ FILE *fp;
int i;
if((fp=fopen("stu_list","rb"))==NULL) //打开输入文件stu_list
{ printf("cannot open infile
"); return; }
for(i=0;i<SIZE;i++)
if(fread(&stud[i],sizeof(struct Student_type),1,fp)!=1)
//从stu_ list文件中读数据
{ if(feof(fp))
{ fclose(fp); return; }
printf("file read error
"); }
fclose(fp);
}
①
②
新知讲授
四
知识点3:fread函数和fwrite函数
从键盘输入10个学生的有关数据,然后把它们转存到磁盘文件上去。(从磁盘文件stu_list中读入二进制数据,借助结构类型数组stud,输出到stu.dat文件中。)
void save() //定义函数save,向文件输出SIZE个学生的数据
{ FILE *fp;
int i;
if((fp=fopen("stu.dat","wb"))==NULL) //打开输出文件stu.dat
{ printf("cannot open file
");
return;
}
for(i=0;i<SIZE;i++)
if(fwrite(&stud[i],sizeof(struct Student_type),1,fp)!=1)
printf("file write error
");
fclose(fp);
}
③
文件“stu_list”中的二进制数据内容如下
新知讲授
四
知识点3:fread函数和fwrite函数
从键盘输入10个学生的有关数据,然后把它们转存到磁盘文件上去。(从磁盘文件stu_list中读入二进制数据,借助结构类型数组stud,输出到stu.dat文件中。)
main()
{ int i;FILE *fp;
load();
save();
if((fp=fopen("stu.dat","rb"))==NULL) //打开输入文件stu.dat
{ printf("cannot open file
"); return; }
for(i=0;i<SIZE;i++)
{
fread(&stud[i],sizeof(struct Student_type),1,fp); //从fp指向的文件读入一组数据
printf("%-10s %4d %4d %-15s
",stud[i].name,stud[i].num,stud[i]. age,stud[i].addr);}
//在屏幕上输出这组数据
fclose(fp); //关闭文件stu_list
}
④
新知讲授
四
知识点4:fprintf函数和fscanf函数
1、概念分析
可以对文件进行格式化输入输出,这时就要用fprintf函数和fscanf函数,从函数名可以看到,它们只是在printf和scanf的前面加了一个字母f。它们的作用与printf函数和scanf函数相仿,都是格式化读写函数。只有一点不同:fprintf和fscanf函数的读写对象不是终端而是文件。
新知讲授
四
知识点4:fprintf函数和fscanf函数
2、一般调用方式
fprintf(文件指针, 格式字符串, 输出表列);
fprintf (fp,″%d,%6.2f″,i,f);
//将int型变量i和float型变量f的值按%d和%6.2f的格式输出到fp指向的文件中
fscanf(文件指针, 格式字符串, 输入表列);
fscanf (fp,″%d,%f″,&i,&f);
//磁盘文件上如果有字符“3,4.5”,则从中读取整数3送给整型变量i,读取实数4.5送给float型变量f
新知讲授
四
知识点4:fprintf函数和fscanf函数
3、例题9-2:用fprintf()函数将2个浮点型数据写入磁盘文件“fb.dat”中,再将这2个浮点型数据从磁盘文件“fb.dat”中读出,并在屏幕上输出。
# include <stdio.h>
main( )
{ FILE *fp;
float i=7.29, k;
fp = fopen ("fb.dat", "wb" ); /* 新建一个二进制文件,磁盘文件名为fb.dat */
fprintf (fp, "%8.1f", i ); /* 将一个浮点型数据写入该文件 */
fprintf (fp, "%8.1f", 12.36 );
fclose ( fp ); /* 关闭文件 */
fp = fopen ("fb.dat", "rb" ); /* 打开一个二进制文件,磁盘文件名为fb.dat */
fscanf ( fp, "%f%f", &i, &k ); /* 从磁盘文件名为fb.dat中读2个浮点型数据 */
printf (" i=%f
k=%f
", i , k );
fclose ( fp );
}
师生互动
五
【文件读写函数大挑战】——谁是C语言"文件操作王"?
第一关:字符读写专家 第二关:字符串处理大师
要从键盘输入字符并保存到文件,直到遇到'#'停止,你会使用:
A. fgets + while循环
B. fgetc + fputc + while循环
C. fscanf + for循环 要把多个字符串写入文件并读回显示,最佳组合是:
A. fputs写入 + fgets读取
B. fwrite写入 + fread读取
C. fprintf写入 + fscanf读取
第三关:二进制数据高手 第四关:格式化读写达人
要保存10个学生结构体数据到文件,应该用:
A. fwrite一次写入整个数组
B. 用for循环逐个fputc写入
C. 用fprintf格式化写入 要保存2个浮点数并读回显示,正确方式是:
A. fwrite写入 + fread读取
B. fprintf写入 + fscanf读取
C. fputs写入 + fgets读取
随堂练习
六
1.以下关于fputc函数的描述,错误的是( )
A. fputc函数用于向文件中写入一个字符
B. fputc函数的第一个参数是要写入的字符
C. fputc函数成功写入后返回EOF
D. fputc函数的第二个参数是文件指针
答案:C
解析: fputc函数成功写入后返回写入的字符,失败时返回EOF。
随堂练习
六
2.使用fgetc函数读取文件时,当遇到文件结束标志时返回( )
A. NULL
B. EOF
C. '\0'
D. -1
答案:B
解析:fgetc函数在遇到文件结束或读取错误时返回EOF。
随堂练习
六
3.以下关于fgets函数的描述,正确的是( )
A. fgets函数从文件中读取一行文本,包括换行符
B. fgets函数读取的字符串会自动添加'\0'
C. fgets函数的第二个参数指定读取的最大字符数
D. 以上都正确
答案:D
解析: fgets函数会读取换行符,并在字符串末尾添加'\0',第二个参数限制读取的字符数。
随堂练习
六
4.以下关于fread函数的描述,错误的是( )
A. fread函数用于从文件中读取二进制数据
B. fread函数的第一个参数是存储数据的缓冲区地址
C. fread函数的第二个参数是每个数据项的大小
D. fread函数返回实际读取的字节数
答案:D
解析:fread函数返回实际读取的数据项个数,而不是字节数。
随堂练习
六
5.使用fwrite函数写入结构体数据时,第三个参数应该是( )
A. 结构体变量的地址
B. 结构体变量的大小
C. 1
D. 结构体成员的数量
答案:C
解析: fwrite函数的第三个参数是要写入的数据项个数,通常写入一个结构体时设为1。
随堂练习
六
6.以下关于fprintf函数的描述,正确的是( )
A. fprintf函数与printf函数用法完全相同
B. fprintf函数的第一个参数是格式字符串
C. fprintf函数的第一个参数是文件指针
D. fprintf函数只能用于文本文件
答案:C
解析: fprintf函数的第一个参数是文件指针,第二个参数是格式字符串。
随堂练习
六
7.以下代码片段的功能是( )
FILE *fp;
char ch;
fp = fopen("file.txt", "r");
while((ch = fgetc(fp)) != EOF) {
putchar(ch);
}
fclose(fp);
A. 将文件内容逐字符读取并显示在屏幕上 B. 将键盘输入写入文件
C. 复制文件内容到另一个文件 D. 统计文件中的字符数
答案:A
解析: 代码使用fgetc函数逐字符读取文件内容,并用putchar函数显示在屏幕上。
随堂练习
六
8.以下代码片段的功能是( )
FILE *fp;
char str[100];
fp = fopen("file.txt", "r");
while(fgets(str, 100, fp) != NULL) {
printf("%s", str);
}
fclose(fp);
A. 逐行读取文件内容并显示在屏幕上 B. 逐字符读取文件内容并显示在屏幕上
C. 将键盘输入写入文件 D. 统计文件中的行数
答案:A
解析:代码使用fgets函数逐行读取文件内容,并用printf函数显示在屏幕上。
课堂小结
七
谢谢
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
$