学习目标:
掌握文件的概念
掌握文件的存储形式
掌握文件指针的概念
重点:
文件的存储形式
文件指针的概念、定义
难点:
文件指针的含义
一、数据文件存储形式
C语言把文件看作是一个字符(字节)的序列,即由一个一个字符(字节)的数据顺序组成。文件的数据存储形式有两种:一种以字符形式存放,称为ASCII文件;另一种是以二进制代码形式存放,称为二进制文件。ASCII文件又称为文本文件,它的每一个字节存放一个ASCII代码,代表一个字符。二进制文件是把内存中的数据按其在内存中的存储形式(二进制代码)原样输出到磁盘上进行存放。例如,2418这个整数,在内存中占2个字节,如果按ASCII码形式输出,则占4个字节,而按二进制形式输出,在磁盘上只占2个字节,如图10-1所示。

一般地说,二进制文件节省存储空间,在输入时不需要把字符代码先转换成二进制形式再送入内存,在输出时也不需要把数据由二进制形式转换为字符代码再输出,因而输入/输出速度快。用户程序在实际应用中,从节省时间和空间的要求考虑,一般选用二进制文件。但是如果用户准备的数据是作为文档进行阅读的,则一般使用字符文件,它们可以方便、快捷地通过显示器或打印机直接输出并显示。
二、文件缓冲区
ANSI C标准采用“缓冲文件系统”处理数据文件
所谓缓冲文件系统是指系统自动地在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区
从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去
如果从磁盘向计算机读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(给程序变量)


三、文件指针
ANSI C采用的是缓冲文件系统,由于文件缓冲区与文件之间的数据交换由系统自动完成,因而C程序对文件的操作实际上就是对文件缓冲区的操作。每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息(缓冲区“满”或“空”的程度、文件状态标志、文件描述符等)。这些信息保存在一个结构体变量中,该结构体类型是由系统定义的,取名为FILE。FILE数据结构在头文件stdio.h中,定义如下:
typedef struct {
short level ; /*缓冲区“满”或“空”的程度*/
unsigned flags ; /*文件状态标志*/
char fd ; /*文件描述符*/
unsigned char hold ; /*如无缓冲区不读取字符*/
short bsize ; /*缓冲区的大小*/
unsigned char *buffer ; /*数据缓冲区的位置*/
unsigned char *curp ; /*指针,当前的指向*/
unsigned istemp ; /*临时文件文件指示器*/
short token ; /*用于有效性检查*/
} FILE;
当程序打开一个文件(若该文件不存在,则表示要建立文件;若文件已存在,则打开就意味着要对该文件进行读写),系统就在内存中建立一个与该文件对应的FILE结构体变量。有几个文件就建立几个这样的结构体变量,分别存放各文件的有关信息。同时返回对应FILE结构指针(地址)。这样,对该文件的操作,都以该指针为参考,用户无须对这个结构的内容进行控制。
程序中不用变量名来标识结构体变量,而是设置一个指向该结构体变量的指针变量。用FILE结构定义文件类型指针的一般形式为:
FILE *fp;
当程序打开一个文件,就得到对应FILE结构指针。只要把该指针赋给指针变量fp,fp就指向了这个FILE结构变量,也就是指向它所代表的文件。
注意:对FILE *fp,此时的fp指向的FILE结构还未与任何文件建立联系,必须调用fopen()函数为文件指针和要操作的存储在磁盘上的数据文件建立联系。
文件指针是一种特殊的指针,其指向文件类型结构体,是多种信息的集合。用户为每一个文件定义一个文件指针,用户就可以通过这个文件指针找到其对应的文件,进而实现对这个文件的读写;同时系统也为这个文件开辟和管理缓冲区,对一般的编程人员来说,不必关心FILE结构内部的细节,FILE结构中的信息由系统进行管理。

