1、01010202030310.1 10.1 文件概述文件概述10.2 10.2 文件操作文件操作10.3 10.3 文件的定位文件的定位第十章第十章 文件文件0404050510.4 10.4 编译预处理编译预处理10.5 10.5 知识知识点强化与应用点强化与应用10.6 10.6 本章本章小结小结0606【学习要点】1.文件的概念2.文件的打开、数据写入和读取3.简单宏定义和带参宏定义的使用4.条件编译本章主要介绍文件的常用操作和条件编译的使用。为了完成对之前录入的学生信息长期存放,现需要将其存放在E盘的student.txt文件中,并能方便的将该文件中需要的信息读出,并进行相关操作。【导
2、入案例:数据的长期存储及读取】在学生信息管理系统中,每次运行系统所录入的数据和运算得到的结果都只存储在内存中,下次再次运行系统时,之前的数据都会消失,不符合系统的真实场景,在实际应用过程中,显然会带来许多不便。【解决方案】将之前存放在内存中的数据存储到磁盘上对应的文件中去。分析10.1 文件概述10.1.1 文件的概念10.1.2 文件的分类10.1.1文件的概念所谓“文件”一般指:存储在外部介质(如磁盘)上数据的集合。将数据存放在文件中,是为了对数据进行长期的保存,弥补了内存不能对数据进行长期存储的缺陷。对数据进行存盘前,数据是存放在内存中,对文件存盘后,数据就存放到磁盘上,即:内存-磁盘(
3、save操作)当需要对磁盘中的数据进行处理时,先需把数据导入到内存,然后对内存中的数据进行操作,即:磁盘-内存(load操作)。10.1.2 文件的分类文件可分为:ASCII码文件和二进制文件两种。ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,C语言中的所有的源程序文件(扩展名为.c)就是ASCII文件。二进制文件是按二进制的编码方式来存放文件的,C语言中的目标文件(扩展名为.obj)和可执行文件(扩展名为.exe)都是二进制文件。10.2 文件操作10.2.1 文件类型指针10.2.2 文件的打开操作10.2.3 文件的关闭操作10.2.4 文件的读写操作10.2
4、.1文件类型指针用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作。定义说明文件指针的一般形式为:FILE*指针变量标识符;指针变量标识符;10.2.2 文件的打开打开文件,实际上是建立文件的各种有关信息,并使文件指针指向该文件,以便进行其它操作,一般是调用fopen函数。打开文件的一般方法为:文件指针名=fopen(文件名,使用文件方式);其中:“文件指针名”必须是被说明为FILE 类型的指针变量;“文件名”是被打开文件的文件名;(或文件的详细路径)“使用文件方式”是指文件的类型和操作要求。例如:FILE*fp1,fp2;fp1=(“t1.txt,r
5、);fp2=(c:hzk16,rb)10.2.2 文件的打开(续)文件的使用方式主要如下表所示:使用方式 意义使用方式 意义 rt只读打开一个文本文件 rt+读写打开一个文本文件 wt只写打开或建立一个文本文件wt+读写打开或建立一个文本文件 at追加打开一个文本文件at+读写打开一个文本文件,或在文件末追加数据 rb只读打开一个二进制文件rb+读写打开一个二进制文件 wb只写打开或建立一个二进制文件 wb+读写打开或建立一个二进制文件 ab追加打开一个二进制文件ab+读写打开一个二进制文件,或在文件末追加数据10.2.3 文件的关闭文件一旦使用完毕,应用关闭文件函数把文件关闭,以避免文件的数
6、据丢失等错误,一般是调用fclose函数来关闭文件。关闭的方法为:fclose(文件指针);如:fclose(fp1);fclose(fp2);10.2.4 文件的读写1)单个字符的读写 读文件:ch=fgetc(fp);/从fp所指向的文件中读取1个的字符赋值给字符变量ch;写文件:fputc(ch,fp);/将字符ch变量的值写入到fp所指向的文件。2)字符串读写和fputs 读文件:fgets(字符数组名,n,fp);/其中的n是一个正整数。表示从fp所指向的文件中读取不超过 n-1个的字符,最后一个字符后加上串结束标志0。然后存放到字符数组中去。在读入的 写文件:fputs(字符数组名
7、,fp);/将字符数组中的内容写入到fp所指向的文件。10.2.4 文件的读写(续)3)数据块读写,一般用于整条记录的读写 读:fread(buffer,size,count,fp);写:fwrite(buffer,size,count,fp);其中:buffer 表示内存中的一块地址;size表示要读写的记录的字节数;count表示一次性要读写的记录的条数;fp是指向待读写的文件的文件指针;10.2.4 文件的读写(续)4)格式化读写函数 读:fscanf(文件指针,格式字符串,输入表列);写:fprintf(文件指针,格式字符串,输出表列);如:fscanf(fp,“%d%f”,&m,&x
8、);/从fp指针所指向的文件的当前位置以%d和%f的格式读取两个数据,并分别赋值给变量m和x;fprintf(fp,“%d%c”,n,ch);/将n和ch变量分别以%d和%c的格式写入到fp所指向的文件中去;10.3 文件定位10.3.1 rewind函数10.3.2 fseek函数10.3.3 ftell函数10.3.4 文件的错误检测10.3 文件的定位文件读写默认的是对文件位置指针当前所在的位置进行处理,而因为特殊需求,用户需要具体定位到文件中的某个特殊位置,此时需要定位到该位置去。10.3.1 rewind函数rewind:使文件位置指针重新回到文件的开头位置。调用格式:rewind(
9、fp);10.3 文件的定位(续)10.3.2 fseekfseek函数函数fseek函数用来移动文件内部位置指针,常用于二进制文件,调用格式:fseek(fp,offset,origin);其中:“offset”是位移量,表示移动的字节数;“origin”是起始点,表示计算偏移量的起始点,规定的起始点有三种:文件首,当前位置和文件尾。起始点表示符号数字表示文件首SEEK_SET0当前位置SEEK_CUR1文件末尾SEEK_END210.3 文件的定位(续)10.3.3 ftellftell函数函数ftellftell函数用来获取文件位置指针的当前位置,调用格式:ftell(fp);该函数用以
10、得到fp所指向的文件的位置指针相对于文件头部的偏移量,单位是字节。10.3 文件的定位(续)10.3.4 文件的错误检测1.ferror函数文件出错检测函数,调用格式:ferror(fp);说明:在文件读写期间,若操作出错则此函数返回值为非零值,若操作正确则返回0;在执行fopen函数时,ferror函数的初始值自动设置为0。2.clearerr函数文件出错复位函数,调用格式:clearerr(fp);说明:文件出错时系统将对其出错标志进行设置。调用该函数可以复位其出错标志,即清除fp指定的文件的错误标志和文件结束标志。函数没有返回值。例1:从键盘输入一个字符串,把它输出到磁盘文件file1.
11、txt中;分析:分析:1.1.定义一个字符数组,按照定义一个字符数组,按照合适的方法完成输入;合适的方法完成输入;2.2.调用调用fputsfputs函数将字符串的函数将字符串的内容输入到指定文件。内容输入到指定文件。参考参考代码段:代码段:char char strstr100100;FILE FILE*fpfp;if if(fpfp=fopenfopen(file1.txt,wb)=NULL)(file1.txt,wb)=NULL)printfprintf(cannot open filen);(cannot open filen);return;return;gets(gets(strs
12、tr););fputsfputs(str,fpstr,fp););10.4 编译预处理10.4.1 宏定义10.4.2 文件包含10.4.3 条件编译10.4 编译预处理常用的预处理命令有:宏定义、文件包含和条件编译。10.3.1宏定义C语言中宏用define命令定义,一般形式为:#define 标识符标识符 值值1.简单宏,一般形式为:#define 标识符标识符 值值 如:#define PI 3.14#define N 1002.带参数的宏 在C语言程序程序中,经常把那些反复使用的运算表达式甚至某些操作定义为参数化宏。此时,宏名带有一个或多个形式参数,在宏定义中的参数称为形式参数,在宏调
13、用中的参数称为实际参数。一般形式为:#define 宏名宏名(形参表形参表)字符串字符串例如:#define M(y)y*y+3*y /*宏定义*/k=M(5);/*宏调用*/10.4.2 文件包含文件包含是C预处理程序的另一个重要功能。文件包含命令行的一般形式为:#include文件名 1.一般情况下,包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来。例如以下写法都是允许的:#includestdio.h#include2.一个include命令只能包含一个指定文件;3.文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件。10.4.3 条件编译预处理提供了条件编译的功能。
14、可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件,条件编译可以有以下三种形式:第一种形式:#ifdef 标识符 程序段1#else 程序段2#endif第二种形式:#ifndef 标识符 程序段1#else 程序段2#endif 第三种形式:#if 常量表达式 程序段1#else 程序段2#endif10.5 知识点强化与应用例2:定义一个结构体用来描述学生的基本信息(学号、姓名、数学分数),录入5个学生信息后,将信息保存到student.txt文件,然后将信息导出后,输出到屏幕。1.1.先定义结构体,并定义全局结构体数组;2.定义input函数,使用for循环,完成5个学生信息的输入;3.定义save函数,使用for循环,调用fwrite函数逐条写入信息到文件;4.定义load函数,使用for循环,调用fread函数逐条导入到全局数组中,并调用printf函数输出。10.6 小结