资源简介 (共32张PPT)C 语言程序设计2023翻转课堂实用教程第11章 文件文件知识点11.1文件案例分析11.2文件课堂练习题11.3123文件的概念二进制文件和文本文件的区别文件的操作知识点文件操作案例分析案例分析文件操作相关练习题练习题11.1 文件知识点11.1 文件知识点当需要大量数据输入时,如成百上千个学生的信息;或者保存大量的输出数据,以供反复查看等, 如何解决数据的保存问题?文件。文件是保存在外部存储介质(磁盘、U盘、光盘等)上的数据集合,是一种数据存储方式,可被长久保存在磁盘文件中。11.1.1 文件的概念事先将输入数据按照一定格式保存在文件中,编写程序从文件中读取数据;再将需要保存的数据输出到文件中。11.1 文件知识点C语言中,供程序运行时输入与输出数据的文件可被称为数据文件。按照数据编码格式的不同,数据文件分为:二进制文件:存储二进制数据的文件。文本文件:存储字符的文件。11.1.2 二进制文件和文本文件的区别11.1 文件知识点二进制文件:存储二进制数据的文件,通常用来保存视频、图片、程序等不可阅读的内容。二进制文件中存储的是每个数据对应的二进制编码。例如:存储整数382整数占用字节数固定,为sizeof(int),占4个字节,则382转化二进制数为:00000000 00000000 00000001 01111110。11.1.2 二进制文件和文本文件的区别00000000 00000000 00000001 01111110二进制文件在中数据采用的编码格式11.1 文件知识点文本文件:存储字符的文件,如记事本文件.txt文件、源程序文件.c文件。。文本文件中每个字符在存储时采用其对应的ASCII、UTF-8等编码,是显示器可以直接显示的形式。例如:存储整数382‘3’ ‘8’ ‘2’11.1.2 二进制文件和文本文件的区别文本文件中数据采用的编码格式00110011 00111000 00110010不同文件中的数据采用了不同的编码格式,须使用对应的软件才能正确解析这些编码,正常显示文件中的内容。11.1 文件知识点在C语言中,对文件的操作流程为:打开文件 --> 读写文件 --> 关闭文件。1、打开文件作用:将当前程序与文件关联在一起,在C语言中,使用中定义的fopen()库函数来打开文件。①文件名称(包括路径) ②打开模式FILE *fopen(char *fileName, char *openMode);③指向结构FILE的指针11.1.3文件的操作——打开文件FILE *fopen(char *fileName, char *openMode);11.1 文件知识点11.1.3文件的操作——打开文件(1) 函数的功能:按照openMode的模式打开fileName文件,两个形参均为字符串。 若打开成功,程序将获取与文件有关的信息,保存在一个名为FILE结构体类型的结构体变量中,fopen()函数将该变量的指针返回。后续通过该指针变量操作文件。若打开失败,fopen()函数返回NULL。举例1:如何打开右侧in.txt文件?FILE *fp = fopen("in.txt","r");(2)FILE为定义在stdio.h中的结构体,用于保存文件信息,例如文件描述符、文件状态、当前读写位置等。 举例2:FILE *fp;if( (fp=fopen("D:\\demo.txt","rb")) == NULL ){//用两个反斜杠指定路径printf("Fail to open file!\n");}举例3:FILE *fp;if( (fp=fopen("D:/demo.txt","rb")) == NULL ){//用一个正斜线指定路径printf("Fail to open file!\n");}FILE *fp=fopen("D:/demo.txt","rb");11.1 文件知识点11.1.3文件的操作——打开文件(3)打开模式打开模式 说明"r"/"rt" 以“只读”模式打开文本文件。文件必须存在,若文件不存在或者文件没有读权限,则文件打开失败。"w"/"wt" 以“只写”模式打开文本文件。若文件不存在,按照fileName创建一个文件;若文件存在,则删除原文件并创建新文件,并从文件头开始写内容。"a"/"at" 以“追加”模式打开文本文件,若文件不存在,按照fileName创建一个文件;若文件存在,保留文件中原有内容,从文件尾开始写内容。"r+"/"r+t" 以“读写”模式打开文本文件。文件必须存在,若文件不存在或者文件没有读写权限,则文件打开失败。若文件存在,从文件头开始读写。"w+"/"w+t" 以“读写”模式打开文本文件。若文件不存在,按照fileName创建一个文件;若文件存在,则删除原文件并创建新文件,从文件头开始读写内容。"a+"/"a+t" 以“追加/更新”模式打开文本文件,若文件不存在,按照fileName创建一个文件;若文件存在,保留文件中原有内容,在文件尾写内容。以上打开模式字符串,是针对文本文件的。将表格中t替换为b就是对二进制文件的操作,如"rb"、"wb"、"ab"、"r+b"、"w+b"、"a+b",表示的含义是一样的。11.1 文件知识点11.1.3文件的操作——读写文件读文件就是从文件中读取数据到内存中由CPU进行处理;写文件是将内存中的数据写入到文件中。对文件进行读写,可以每次读写单个字符,也可以每次读写一行字符串或标准化读取,介绍三组读写函数:(1)单字符形式文件读写函数(2)字符串形式文件读写函数(3)格式化文件读写函数11.1 文件知识点11.1.3文件的操作——读写文件(1)单字符形式文件读写函数单字符读函数fgetc(),与getchar()类似,其函数原型如下:①文件指针fpint fgetc(FILE *fp);②读取到的字符从fp指向的文件中读取一个字符。读取成功则返回该字符。读到文件结尾或者读取失败,则返回EOF。关于符号常量EOF:EOF为头文件定义的值为-1的符号常量,表示文件结束符。若feof(fp) == 0为真,表示fp指向的文件未到文件尾,11.1 文件知识点11.1.3文件的操作——读写文件(1)单字符形式文件读写函数单字符写函数fputc(),与putchar()类型,其函数原型如下:①待写入到文件的字符 ②文件指针fpint fputc(char ch,FILE *fp);②ch字符的ASCII码向fp指向的文件中写入一个字符ch。 写入成功,则返回该字符的ASCII码,fp的当前写位置往后移动一个字符位置。 写入失败,则返回EOF。11.1 文件知识点11.1.3文件的操作——读写文件举例1:从in.txt中读取10个字符,将其中的字母进行大小写的转换,并输出到out.txt中。 int i;FILE *fpIn = fopen("in.txt","r"); //以读的权限打开in.txt文本文件FILE *fpOut = fopen("out.txt","w"); //以写的权限打开out.txt文本文件if( fpIn!= NULL && fpOut!=NULL ){for(i=0;i<10;i++){ //调用10次fgetc()函数读取10个字符char ch = fgetc(fpIn);if(ch>='A'&& ch<='Z') ch = ch+('a'-'A');//转化为对应小写字母else if(ch>='a'&& ch<='z') ch = ch-('a'-'A');//转化为对应大写字母fputc(ch,fpOut);}fclose(fpIn); fclose(fpOut);fpIn = NULL; fpOut = NULL;}else{printf("Fail to open file!\n");}11.1 文件知识点11.1.3文件的操作——读写文件(2)字符串形式文件读写函数字符串读函数fgets(),与gets()类似,其函数原型如下:①存放字符串的数组指针 ②文件指针fpchar* fgets(char *str,int n,FILE *fp);③返回字符串首地址 ④读取的字符个数从fp指向的文件中读取一行中的n个字符,并保存到str字符数组中。 读取成功则返回该字符串,读取到的字符串会在末尾添加’\0’,这个’\0’也被包含在n个字符中,实际只读到n-1个字符,如果想读10个字符,此处n设置为11。 读取失败或者读到文件末尾,则返回NULL。11.1 文件知识点11.1.3文件的操作——读写文件(2)字符串形式文件读写函数fgets是否可以实现从文件中读取一行呢?当fgets()函数在读取到n-1个字符前,出现了换行或者读到文件尾,则停止读取数据,也就是说,即使n非常大,fgets()函数最多读取一行数据。如果将n设置为比每行数据个数都大的数值,便可以实现从文件中读取一行的功能。11.1 文件知识点11.1.3文件的操作——读写文件(2)字符串形式文件读写函数字符串写函数fputs(),其函数原型如下:①字符串 ②文件指针fpint fputs (char *str,FILE *fp);③表示结果的整数将str字符数组中的字符(不包括’\0’)写入到fp指向的文件中。 写入字符串成功,返回0。 写入字符串失败时,返回EOF。11.1 文件知识点11.1.3文件的操作——读写文件 int i; char str[11]={'\0'};FILE *fpIn = fopen("in.txt","r"); FILE *fpOut = fopen("out.txt","a");if( fpIn!= NULL && fpOut!=NULL ){//读取10个字符,fgets函数的第二个参数设置为11,包括一个'\0'if(fgets(str,11,fpIn)!=NULL){for(i=0;i<10;i++){ //从in.txt中读取的10个字符保存在str数组中if(str[i]>='A'&& str[i]<='Z') str[i] = str[i]+('a'-'A');else if(str[i]>='a'&& str[i]<='z') str[i] = str[i]-('a'-'A');}fputs(str,fpOut); //将经过大小写转换的字符串写入out.txt文件中}fclose(fpIn); fclose(fpOut);fpIn = NULL; fpOut = NULL;}else{printf("Fail to open file!\n");}举例2:使用fgets和fputs函数重新实现前一个例子:从in.txt中读取10个字符,将其中的字母进行大小写的转换,并输出到out.txt中基于前面的例子,得到运行结果。11.1 文件知识点11.1.3文件的操作——读写文件(3)格式化文件读写函数对整数、浮点数、字符等更多的数据类型进行处理。格式化文件读函数fscanf(),其函数原型如下:①文件指针fp ② 待赋值的变量地址int fscanf (FILE *fp,格式控制字符串,变量地址列表);③ 读取数据的个数 ④用于控制输入格式的字符串从fp指向的文件中按照格式控制字符串中的格式要求读取数据给到变量地址列表中的所有变量。 从文件中读取数据成功,则返回被成功赋值的变量的个数。 从文件中读取数据失败,则返回负数。11.1 文件知识点11.1.3文件的操作——读写文件(3)格式化文件读写函数对整数、浮点数、字符等更多的数据类型进行处理。格式化文件写函数fprintf(),其函数原型如下:①文件指针fp ②待输出的变量int fprintf (FILE *fp,格式控制字符串,输出参数列表);③输出数据的个数 ④用于控制输出格式的字符串将输出参数列表中所有变量的值,按照格式控制字符串中的格式要求,写入到fp指向的文件中。 向文件中写入数据成功,则返回被成功输出的变量的个数。向文件中写入数据失败,则返回EOF。11.1 文件知识点11.1.3文件的操作——读写文件#includeint main(){int index;char english[10]={'\0'},chinese[15] ={'\0'};FILE *fpIn = fopen("words.txt","r");FILE *fpOut = fopen("test.txt","w");if( fpIn!= NULL && fpOut!=NULL ){while(feof(fpIn) == 0){ //feof函数返回0,表示未到文件尾//分别获取序号、英文单词及其中文含义fscanf(fpIn,"%d %s %s",&index,english,chinese);//只保留序号、中文含义,并将序号、中文含义输出到test.txt中fprintf(fpOut,"%d %s\n",index,chinese);}fclose(fpIn); fclose(fpOut);fpIn = NULL; fpOut = NULL;}elseprintf("Fail to open file!\n");return 0;}举例3:现有一个英语单词表,按照“序号 英文单词 中文含义”的方式存储在words.txt中,某位学生希望通过编写程序获取一个只有“序号 中文含义”的文件test.txt,方便其通过中文含义默写英文单词,请编写程序帮Ta实现该功能。11.1 文件知识点11.1.3文件的操作——关闭文件关闭文件就是取消程序与文件之间的关联,销毁指向FILE类型结构体变量的指针fp。文件被关闭后,便不能被操作了。fclose()函数的原型为:①文件指针fpint fclose(FILE *fp);②文件关闭结果关闭文件指针fp指向的文件,并返回关闭结果。文件正常关闭,则fclose()返回0值。文件关闭失败,则fclose()返回非0值。11.1 文件知识点11.1.3文件的操作——关闭文件举例: FILE *fp;if( (fp=fopen("demo.txt","a")) == NULL ){printf("Fail to open file!\n"); return 0;}...fclose(fp);fp=NULL;当使用fclose将fp指向的文件关闭后,建议将fp赋为空指针NULL。11.2 文件案例分析11.2 文件案例分析案例11.2.1 利用fgets函数实现从文件中读取一行的实例。要求:从in.txt中按行读取字符(每行不超过100个字符),并将其中的字母进行大小写的转换,最后按行输出到out.txt中。#includeint main(){int i; char str[101]={'\0'};FILE *fpIn = fopen("in.txt","r"); FILE *fpOut = fopen("out.txt","w");if( fpIn!= NULL && fpOut!=NULL ){while(feof(fpIn) == 0){if(fgets(str,101,fpIn)!=NULL){for(i=0;str[i]!='\0';i++){if(str[i]>='A'&& str[i]<='Z') str[i] = str[i]+('a'-'A');else if(str[i]>='a'&& str[i]<='z') str[i] = str[i]-('a'-'A');}fputs(str,fpOut);}}fclose(fpIn); fclose(fpOut); fpIn = NULL; fpOut = NULL;}elseprintf("Fail to open file!\n");return 0;}11.2 文件案例分析案例11.2.2要求:从文件中读取一个班级学生的信息(学生人数不超100),学生信息包括学号、姓名、课程名、成绩,并统计该班的平均分,以及所有不低于平均份的学生,输出到文件。#include#define MAX 100typedef struct student{int no; //学生学号char name[20]; //学生姓名char course[30]; //课程名double score; // 成绩}Student;int main(){Student students[MAX];int i = 0,num = 0;double sum = 0,average;FILE *fpInfo = fopen("information.txt","r");FILE *fpOut = fopen("output.txt","w+");11.2 文件案例分析案例11.2.2if(fpInfo !=NULL && fpOut!= NULL){for(i=0;ifscanf(fpInfo,"%d %s %s %lf",&students[i].no,students[i].name,students[i].course,&students[i].score);sum += students[i].score;}num = i; //读取的个数average = sum/num;fprintf(fpOut,"the average score is %.2f\n",average);for(i=0;iif(students[i].score>=average)fprintf(fpOut,"%d %s %s %.0f\n",students[i].no,students[i].name,students[i].course,students[i].score);}fclose(fpInfo); fclose(fpOut);fpInfo = NULL; fpOut = NULL;}elseprintf("文件打开失败");return 0;}11.3 文件课堂练习题11.3 文件课堂练习题课堂练习题11.3.1 写出执行下面程序后的输出结果。#includeint main(){int i;FILE *fpIn = fopen("in.txt","r");if( fpIn!= NULL){while(feof(fpIn) == 0){char ch = fgetc(fpIn);if(ch>='0' && ch<='9')putchar(ch);}fclose(fpIn);;fpIn = NULL;}else{printf("Fail to open file!\n");}return 0;}11.3 文件课堂练习题课堂练习题11.3.2 F盘下面有一个input.txt,请编写程序打开该文件,提取其中的英文字符,并将所有的英文字符输出到F盘下面的output.txt中。课堂练习题11.3.3从文件中读取所有用户的信息(包括用户名和密码),并对密码进行加密后,重新输出到文件中。【微视频】宏定义谢谢观看程序设计基础 展开更多...... 收起↑ 资源预览