第10章文件本章内容10.1文件的基本知识10.2打开与关闭文件10.3顺序读写数据文件10.4随机读写数据文件10.5文件读写的出错检测文件的基本知识——输入输出之前各章中处理的数据输入:键盘-内存输出:内存-显示器实际上也可能是输入:外部设备-内存(读文件)输出:内存-外部设备(写文件)操作系统把各种设备都统一作为文件处理文件的基本知识——文件分类文件:存放在存储介质(磁盘、光盘、半导体存储器)上的相关信息集合程序设计中主要用到两种文件:程序文件数据文件本章讨论的是数据文件文件的基本知识——文件标识文件有唯一的文件标识,以便识别和引用文件标识包括三部分:文件路径:文件保存的位置文件名主干:命名应体现文件的内容文件后缀:体现文件的格式,参见“常用文件扩展名”文件的基本知识——流式文件C语言把文件看作是字符(或字节)的序列。文件以“流”的形式在程序与操作系统间流动。文件的基本知识——数据的形式根据数据的组织形式,数据文件可分为ASCII文件:数据逐个字符的ASCII码输出到外存,也称文本文件二进制文件:内存中二进制形式的数据直接输出到外存文件的基本知识——数据的形式字符:一律以ASCII形式存储数值:既可用ASCII形式存储,也可以用二进制形式存储。例:(10000)10001100010011000000110000001100000011000010000ASCII形式00000000000000000010011100010000二进制形式10000文件的基本知识——文件缓冲区从内存向外存输出数据程序数据区输出文件缓冲区输入文件缓冲区磁盘装满缓冲区文件的基本知识——文件缓冲区程序数据区输出文件缓冲区输入文件缓冲区磁盘从外存向内存读入数据充满缓冲区文件的基本知识——文件指针被使用的文件在内存中开辟一个相应的文件信息区,存放文件的信息(如文件名、状态及当前位置等)这些信息保存在一个结构体变量中。该结构体类型由系统声明,名为FILE声明FILE结构体类型的信息包含在头文件“stdio.h”中一般设置一个指向FILE类型变量的指针变量,通过它引用FILE类型变量文件的基本知识——文件指针FILE*fp1,*fp2,*fp3;文件f1的文件信息区fp1文件f2的文件信息区fp2文件f3的文件信息区fp3文件的基本知识——文件的操作写文件:打开-写-关闭读文件:打开-读-关闭文件的打开功能:为文件建立相应的信息区(存放文件信息)和文件缓冲区(暂时存放输入输出的数据)函数:fopen(文件名,使用文件方式);例:fopen(a1.dat,r);文件的打开打开文件时,通常指定一个指针变量指向该文件,通过该指针变量对文件进行读写。例:FILE*fp;fp=fopen(a1.dat,r);三个要点:文件名;读写方式;指针文件的打开——打开文件的方式P.336-337表10.1r:读w:写(重写,覆盖原数据)a:写(追加)b:二进制文件若文件不存在:读和追加:出错(P.336例,排错)重写:建立新文件文件的关闭功能:撤销文件信息区和文件缓冲区函数:fclose(文件指针);例:fclose(fp);读写文件后不关闭,可能会丢失数据。文件的读写方式顺序读写:读写顺序与数据的物理顺序一致(P.338)随机读写:可以对文件中指定位置的数据进行读写(P.349)顺序文件的读写——读写字符函数形式功能返回值fgetc(fp)从fp指向的文件读入一个字符成功:返回所读字符;失败:返回EOFfputc(ch,fp)把字符ch写到fp所指向的文件成功:返回输出的字符;失败:返回EOF顺序文件的读写——读写字符例10.1连续读入一串字符并写入文件例10.2将一个文件内容复制到另一文件考虑:如何实现文件的合并?顺序文件的读写——读写字符串函数形式功能返回值fgets(str,n,fp)从fp指向的文件,读入长度为(n-1)的字符串,存放到字符数组str成功:返回地址str;失败:返回NULLfputs(str,fp)str所指向的字符串写到文件指针变量fp所指向的文件成功:返回0;失败:返回非0值顺序文件的读写——读写字符串例10.3从键盘输入3个字符串,排序,把排序后的字符串写入文件(P.342-343)读上面写好的文件(P.344)顺序文件的读写——格式化读写fprintf(文件指针,格式字符串,输出表列);fscanf(文件指针,格式字符串,输入表列);例:fprintf(fp,%d,%6.2f,i,f);fscanf(fp,%d,%f,&i,&f);——很少用顺序文件的读写——二进制读写fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);读/写数据的首地址读/写的字节数读/写的数据项数文件指针顺序文件的读写——二进制读写例10.4从键盘输入10个学生的数据(4个数据项),存放在结构体数组中,再将数据写入文件(P.346-347)读上面写好的文件(P.347-348)从另一个已有的文件里读数据(P.349)