12.1 C语言文件的概念
考点1 文件的概念和文件指针
真考链接
考点1较简单,属于重点理解重点掌握知识点,在选择题中的考核概率为20%。
1. 文件的概念
在C语言中,对于输入、输出的数据都按“数据流”的形式来处理。输出时,系统不添加任何信息;输入时,逐一读入数据,直至遇到EOF或文件结束标识为止。C程序中的输入、输出文件,都以数据流的形式存储在介质上。
对文件的输入、输出方式也称“存取方式”。在C语言中,有两种对文件的存取方式:顺序存取和直接存取。
顺序存取文件的特点是:每当“打开”这类文件进行读或写操作时,总是从文件的开头到结尾按顺序地读或写;要读第n个字节时,先要读取前n-1个字节,而不能一开始就读到第n个字节,要写第n个字节时,先要写前n-1个字节。
直接存取文件又称随机存取文件,其特点是可以通过调用C语言的库函数去指定开始读(写)的字节号,然后直接对此位置上的数据进行读(写)操作。
数据存放在介质上的形式分为文本形式和二进制形式,因此可以按数据的存放形式分为文本文件和二进制文件。这两种文件都既可以采用顺序方式,又可以采用直接(随机)方式进行存取。
文本文件的特点:当输出时,数据按面值转换成一串字符,每个字符以字符的ASCII代码值存储到文件中,一个字符占一个字节。
当用printf()函数进行输出时就进行了这样的转换,只是在内部处理过程中,指定了输出文件为终端屏幕。反之,当输入时,又把指定的一串字符按类型转换成数据,并存入内存。如当调用scanf()函数进行输入时就进行了这种转换,只是在内部处理过程中,指定了终端键盘为输入文件。
当数据按照二进制数形式直接输出到文件中时,数据不经过任何转换,按计算机内的存储形式直接存放到磁盘上;也就是说,对于字符型数据,每个字符占一个字节,对于int类型数据,每个数据占两个字节,当从二进制文件中读入数据时,不必经过任何转换,而直接将读入的数据存入变量所占内存空间中。在二进制文件中,因为不存在转换的操作,从而提高了对文件输入、输出的速度。
注意:不能将二进制数据直接输出到终端屏幕,也不能从键盘输入二进制数据。
在对文件进行输入或输出时,系统将为输入或输出文件开辟缓冲区。“缓冲区”是系统在内存中为各文件开辟的一片存储区。当对某文件进行输出时,系统首先把输出的数据填入为该文件开辟的缓冲区内,当缓冲区被填满时,就把缓冲区中的内容一次性地输出到对应文件中。当从某文件输入数据时,首先将从输入文件中输入的一批数据放入该文件的内存缓冲区中,输入语句将从该缓冲区中依次读取数据;当该缓冲区中的数据被读完时,再从输入文件中输入一批数据放入缓冲区。这样可以很好地提高读取效率。
2. 文件指针
文件指针是指向一个结构体类型的指针变量,这个结构体中包含有缓冲区的地址、在缓冲区中当前存取的字符位置、对文件是“读”还是“写”、是否出错、是否已经遇到文件结束标识等信息。编程时不必去了解其中的细节,所有一切都在stdio.h头文件中进行了定义。称此结构体类型名为FILE,可以用此类型名来定义文件指针。
定义文件类型指针变量的一般形式为:
FILE* 指针变量名;
例如:
FILE*fp;
fp被定义为指向文件类型的指针变量,称为文件指针。
小提示
在C语言中,文件是一个字节流或二进制流,也就是说,对于输入、输出的数据都按“数据流”的形式进行处理。输出时,系统不添加任何信息;输入时,逐一读入数据,直至遇到文件的结束标识。
顺序存取文件的特点是:每当“打开”文件进行读或写操作时,总是从文件的开头开始,从头到尾顺序地读写。
常见问题
直接存取文件的特点是什么?
可以通过C语言的库函数去指定开始读(写)的字节号,然后直接对此位置上的数据进行读写操作。
真题精选
若fp是指向某文件的指针,且已读到文件的末尾,则表达式feof(fp)的返回值是( )。
A.EOF B.-1 C.非零值 D.NULL
【答案】C
【解析】因为fp的值就是1,故选项A和选项B皆不是正确答案。当文件读到结尾时,feof(fp)为非零值,否则为0。