10.1 文件的有关基本知识
- 1、文件
- (1)概述
“文件”一般指存储在外部介质上数据的集合,一批数据是以文件的形式存放在外部介质(如磁盘)上的。 - (2)分类
按存储内容分类有:
①程序文件
这种文件的内容是程序代码,包括源程序文件(后缀为.c)、目标文件(后缀为.obj)、可执行文件(后缀为.exe)等。
②数据文件
文件的内容不是程序,而是供程序运行时读写的数据。 - (3)数据流与流式文件
输入输出是数据传送的过程,常将输入输出形象地称为流(stream),即数据流,通常为字符流或字节(内容为二进制数据)流。
流式文件的存取是以字符(字节)为单位的,其输入输出数据流的开始和结束仅受程序控制而不受物理符号(如回车换行符)控制。
- (1)概述
- 2、文件名
一个文件要有一个唯一的文件标识,以便用户识别和引用,一般称为文件名。文件标识包括3部分:文件路径、文件主干名、文件后缀,如下图所示file1.dat文件存放在D盘中的CC目录下的temp子目录下面。
- 3、文件的分类
- (1)文件分类
根据数据的组织形式,数据文件可分为ASCII文件和二进制文件。
①二进制文件
数据在内存中是以二进制形式存储的,可以认为它是存储在内存的数据的映像,所以也称之为映像文件(image file)。
②ASCII文件
如果要求在外存上以ASCII代码形式存储,则需要在存储前进行转换。ASCII文件又称文本文件(text file),每一个字节放一个字符的ASCII代码。 - (2)数据存储
根据以上两种文件的分类,整数10000的存储方式如下图所示。
- (1)文件分类
- 4、文件缓冲区
缓冲文件系统如下图所示,只有文件缓冲区满后再一起进行输入输出。
- 5、文件类型指针
- (1)概述
文件使用时,文件相关信息会保存在系统声明的结构体变量中,类型用FILE表示,文件类型指针即指向该结构体类型的指针。 - (2)定义文件指针
FILE *f;
定义fp是一个指向FILE类型数据的指针变量,可以使fp指向某一个文件的文件信息区,通过该文件信息区中的信息能够访问该文件。如果有n个文件,应设n个指针变量,分别指向n个FILE类型变量,以实现对n个文件的访问。
- (1)概述
10.2 打开与关闭文件
- 1、用fopen函数打开数据文件
- (1)概述
fopen函数的调用方式为:
fopen(文件名,使用文件方式);
其中包含三个信息:
①需要打开文件的名字;
②使用文件的方式(“读”还是“写”等);
③函数返回值给哪一个指针变量指向被打开的文件。 - (2)使用文件方式
使用文件方式,如下表所示。
- (1)概述
- 2、用fclose函数关闭数据文件
- (1)概述
在使用完一个文件后应该关闭它,“关闭”是指撤销文件信息区和文件缓冲区,使文件指针变量不再指向该文件。其调用形式为:
fclose(文件指针);
fclose函数也带回一个值,当成功地执行了关闭操作,则返回值为0;否则返回EOF(-1)。 - (2)工作原理
在程序结束前应先关闭文件,这样就先把缓冲区中的数据输出到磁盘文件,然后撤销文件信息区,从而防止数据丢失的可能。
- (1)概述
10.3 顺序读写数据文件
- 1、向文件读写字符
对文本文件读入或输出一个字符的函数,如下表所示。
- 2、向文件读写一个字符串
读写一个字符串的函数,如下表所示。
- 3、用格式化的方式读写文件
格式化输入输出调用方式为:
fprintf(文件指针,格式字符串,输出表列);
fscanf(文件指针,格式字符串,输入表列);
其特点是由于需要在二进制内存变量与ASCII码文件之间频繁转换,因此使用fprintf和fscanf函数会花费较多时间。 - 4、用二进制方式向文件读写一组数据
- (1)概述
C语言允许用fread函数从文件中读一个数据块,用fwrite函数向文件写一个数据块,在读写时都是以二进制形式进行的。 - (2)调用形式
它们的一般调用形式为:
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
其各参数为:
①buffer,是一个地址。对fread来说,它是用来存放从文件读入数据的存储区地址。对fwrite来说,是要把此地址开始的存储区数据向文件输出(以上指的是起始地址)。
②size,数据项的字节数。
③count,要读写多个数据项(每个数据项长度为size)。
④fp,FILE类型指针。
- (1)概述
10.4 随机读写数据文件
- 1、文件位置标记及其定位
- (1)文件位置标记
为了对读写进行控制,系统为每个文件设置了一个文件读写位置标记(简称文件位置标记或文件标记),用来指示“接下来要读写的下一个字符的位置”。
随机读写是指读写完上一个字符(字节)后,并不一定要读写其后续的字符(字节),而可以读写文件中任意位置上所需要的字符(字节)。 - (2)文件位置标记的定位
①用rewind函数使文件位置标记指向文件开头,其形式为:
rewind(文件类型指针);
该函数无返回值。
②用fseek函数改变文件位置标记
fseek(文件类型指针,位移量,起始点);
其中参数为:
a.“起始点”用0、1或2代替,0代表“文件开始位置”,1为“当前位置”,2为“文件末尾位置”;
b.“位移量”指以“起始点”为基点,向前移动的字节数,位移量应是long型数据。
③用ftell函数测定文件位置标记的当前位置,其形式为:
ftell(文件类型指针);
其返回值为相对于文件开头的位置量、若出错,则返回-1L
- (1)文件位置标记
- 2、随机读写
通过rewind和fseek函数,再调用顺序读写数据相关函数,就可以实现随机读写。
10.5 文件读写的出错检测
在调用各种输入输出函数时,因为返回值EOF不仅能够表示文件结束,同时能够表示输入输出操作中读、写出错及其他一些关联操作的错误状态,因此仅凭EOF并不能判断文件读写是否出错。
- 1、ferror函数
ferror(fp);
如果ferror返回值为0(假),表示未出错;如果返回一个非零值,表示出错。
对同一个文件每一次调用输入输出函数,都会产生一个新的ferror函数值,因此,应当在调用一个输入输出函数后立即检查ferror函数的值,否则信息会丢失。 - 2、clearerr函数
clearerr(fp);
clearerr的作用是使文件错误标志和文件结束标志置为0,假设在调用一个输入输出函数时出现错误,ferror函数值为一个非0值,以便再进行下一次的检测。