FILE结构体用于文件操作,定义在C语言的stdio.h头文件中
我们通常所写的FILE *fp; 定义了一个指向该结构体的指针,通过fopen()返回一个指向要打开(或写入、创建)文件的指针
结构体中的成员_file实际上是一个描述符,用于进入打开文件表索引的指针
下图是我在VS2013中截的图
#ifndef _FILE_DEFINEDstruct _iobuf {
char *_ptr; //文件输入的下一个位置
int _cnt; //当前缓冲区的相对位置
char *_base; //指基础位置(即是文件的其始位置)
int _flag; //文件标志
int _file; //文件的有效性验证
int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取
int _bufsiz; //文件大小
char *_tmpfname; //临时文件名
};
typedef struct _iobuf FILE;#define _FILE_DEFINED#endif
C语言通过FILE结构可以间接操作文件控制块(FCB)
文件是存放在物理磁盘上的,包括FCB和数据块
文件控制块中存放的在上面的图中;
数据块用来存储实际的内容。
系统维护了两张表,一张是系统级打开文件表,一张是进程级打开文件表。
系统级打开文件表 复制了文件控制块的信息等;
进程级打开文件表 保存了指向系统级文件表的指针及其他信息。
系统级文件表每一项都保存一个计数器(该文件打开的次数)。当我们打开一个文件时,系统首先查看该文件是否已在系统级文件表中,如果已经存在就把该项的计数器加一,如果不在则创建该项信息。
当我们关闭一个文件时,该文件对应的计数器会减1,当减到0时,系统将系统级文件表中的项删除。
进程打开一个文件时,会在进程级文件表中添加一项。每项的信息包括当前文件偏移量(读写文件的位置)、存取权限、一个指向系统级文件表中对应文件项的指针。
FILE结构体中的_file成员应该是指向进程级打开文件表,然后,通过进程级打开文件表可以找到系统级打开文件表,进而可以通过FCB操作物理磁盘上面的文件。系统级文件表中的每一项通过文件描述符(一个非负整数)来标识。