《C语言程序设计》 课件11 文件_第1页
《C语言程序设计》 课件11 文件_第2页
《C语言程序设计》 课件11 文件_第3页
《C语言程序设计》 课件11 文件_第4页
《C语言程序设计》 课件11 文件_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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转化二进制数为:00000000000000000000000101111110。11.1.2二进制文件和文本文件的区别00000000000000000000000101111110二进制文件在中数据采用的编码格式11.1文件知识点文本文件:存储字符的文件,如记事本文件.txt文件、源程序文件.c文件。。文本文件中每个字符在存储时采用其对应的ASCII、UTF-8等编码,是显示器可以直接显示的形式。例如:存储整数382‘3’‘8’‘2’11.1.2二进制文件和文本文件的区别文本文件中数据采用的编码格式001100110011100000110010不同文件中的数据采用了不同的编码格式,须使用对应的软件才能正确解析这些编码,正常显示文件中的内容。11.1文件知识点在C语言中,对文件的操作流程为:打开文件-->读写文件-->关闭文件。1、打开文件作用:将当前程序与文件关联在一起,在C语言中,使用<stdio.h>中定义的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("Failtoopenfile!\n");}举例3:FILE*fp;if((fp=fopen("D:/demo.txt","rb"))==NULL){//用一个正斜线指定路径 printf("Failtoopenfile!\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()类似,其函数原型如下:

①文件指针fpintfgetc(FILE*fp);②读取到的字符从fp指向的文件中读取一个字符。读取成功则返回该字符。读到文件结尾或者读取失败,则返回EOF。关于符号常量EOF:EOF为<stdio.h>头文件定义的值为-1的符号常量,表示文件结束符。若feof(fp)==0为真,表示fp指向的文件未到文件尾,11.1文件知识点11.1.3文件的操作——读写文件(1)单字符形式文件读写函数单字符写函数fputc(),与putchar()类型,其函数原型如下:

①待写入到文件的字符②文件指针fpintfputc(charch,FILE*fp);②ch字符的ASCII码向fp指向的文件中写入一个字符ch。写入成功,则返回该字符的ASCII码,fp的当前写位置往后移动一个字符位置。写入失败,则返回EOF。11.1文件知识点11.1.3文件的操作——读写文件举例1:从in.txt中读取10个字符,将其中的字母进行大小写的转换,并输出到out.txt中。

inti; 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个字符 charch=fgetc(fpIn); if(ch>='A'&&ch<='Z')ch=ch+('a'-'A');//转化为对应小写字母 elseif(ch>='a'&&ch<='z')ch=ch-('a'-'A');//转化为对应大写字母 fputc(ch,fpOut); }

fclose(fpIn);fclose(fpOut); fpIn=NULL;fpOut=NULL; }else{ printf("Failtoopenfile!\n"); }11.1文件知识点11.1.3文件的操作——读写文件(2)字符串形式文件读写函数字符串读函数fgets(),与gets()类似,其函数原型如下:

①存放字符串的数组指针

②文件指针fp

char*fgets(char*str,intn,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(),其函数原型如下:

①字符串②文件指针fp

intfputs(char*str,FILE*fp);

③表示结果的整数将str字符数组中的字符(不包括’\0’)写入到fp指向的文件中。写入字符串成功,返回0。写入字符串失败时,返回EOF。11.1文件知识点11.1.3文件的操作——读写文件

inti;charstr[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'); elseif(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("Failtoopenfile!\n"); }举例2:使用fgets和fputs函数重新实现前一个例子:从in.txt中读取10个字符,将其中的字母进行大小写的转换,并输出到out.txt中基于前面的例子,得到运行结果。11.1文件知识点11.1.3文件的操作——读写文件(3)格式化文件读写函数对整数、浮点数、字符等更多的数据类型进行处理。格式化文件读函数fscanf(),其函数原型如下:

①文件指针fp

②待赋值的变量地址

intfscanf(FILE*fp,格式控制字符串,变量地址列表);③读取数据的个数

④用于控制输入格式的字符串从fp指向的文件中按照格式控制字符串中的格式要求读取数据给到变量地址列表中的所有变量。从文件中读取数据成功,则返回被成功赋值的变量的个数。从文件中读取数据失败,则返回负数。11.1文件知识点11.1.3文件的操作——读写文件(3)格式化文件读写函数对整数、浮点数、字符等更多的数据类型进行处理。格式化文件写函数fprintf(),其函数原型如下:

①文件指针fp

②待输出的变量

intfprintf(FILE*fp,格式控制字符串,输出参数列表);③输出数据的个数

④用于控制输出格式的字符串将输出参数列表中所有变量的值,按照格式控制字符串中的格式要求,写入到fp指向的文件中。

向文件中写入数据成功,则返回被成功输出的变量的个数。向文件中写入数据失败,则返回EOF。11.1文件知识点11.1.3文件的操作——读写文件#include<stdio.h>intmain(){ intindex; charenglish[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; }else printf("Failtoopenfile!\n"); return0;}

举例3:现有一个英语单词表,按照“序号英文单词中文含义”的方式存储在words.txt中,某位学生希望通过编写程序获取一个只有“序号中文含义”的文件test.txt,方便其通过中文含义默写英文单词,请编写程序帮Ta实现该功能。11.1文件知识点11.1.3文件的操作——关闭文件关闭文件就是取消程序与文件之间的关联,销毁指向FILE类型结构体变量的指针fp。文件被关闭后,便不能被操作了。fclose()函数的原型为:

①文件指针fp

intfclose(FILE*fp);②文件关闭结果关闭文件指针fp指向的文件,并返回关闭结果。文件正常关闭,则fclose()返回0值。文件关闭失败,则fclose()返回非0值。11.1文件知识点11.1.3文件的操作——关闭文件举例:

FILE*fp;if((fp=fopen("demo.txt","a"))==NULL){printf("Failtoopenfile!\n");return0;}...fclose(fp);fp=NULL;当使用fclose将fp指向的文件关闭后,建议将fp赋为空指针NULL。

11.2文件案例分析11.2文件案例分析案例11.2.1利用fgets函数实现从文件中读取一行的实例。要求:从in.txt中按行读取字符(每行不超过100个字符),并将其中的字母进行大小写的转换,最后按行输出到out.txt中。#include<stdio.h>intmain(){inti;charstr[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'); elseif(str[i]>='a'&&str[i]<='z')str[i]=str[i]-('a'-'A'); } fputs(str,fpOut); } } fclose(fpIn);fclose(fpOut);fpIn=NULL;fpOut=NULL;}else printf("Failtoopenfile!\n");return0;}11.2文件案例分析案例11.2.2

要求:从文件中读取一个班级学生的信息(学生人数不超100),学生信息包括学号、姓名、课程名、成绩,并统计该班的平均分,以及所有不低于平均份的学生,输出到文件。#include<stdio.h>#defineMAX100typedefstructstudent{ intno;//学生学号 charname[20];//学生姓名 charcourse[30];//课程名 doublescore; //成绩}Student;intmain(){ Studentstudents[MAX]; inti=0,num=0; doublesum=0,average; FILE*fpInfo=fopen("information.txt","r"); FILE*fpOut=fopen("output.txt","w+");11.2文件案例分析案例11.2.2

if(fpInfo!=NULL&&fpOut!=NULL){ for(i=0;i<MAX&&feof(fpInfo)==0;i++){ fscanf(fpInfo,"%d%s%s%lf",&students[i].no,students[i].name, students[i].course

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论