FILE结构体用于文件操作,定义在C语言的stdio.h头文件中

我们通常所写的FILE *fp; 定义了一个指向该结构体的指针,通过fopen()返回一个指向要打开(或写入、创建)文件的指针 

结构体中的成员_file实际上是一个描述符,用于进入打开文件表索引的指针


下图是我在VS2013中截的图


wKioL1cCJYSjsU6sAABFegBLXtA503.png 


#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


061218499222522.jpg


C语言通过FILE结构可以间接操作文件控制块(FCB)

文件是存放在物理磁盘上的,包括FCB和数据块

文件控制块中存放的在上面的图中;

数据块用来存储实际的内容。


wKioL1cCMBzAbgb7AABp_aZjgV4738.png


系统维护了两张表,一张是系统级打开文件表,一张是进程级打开文件表。

系统级打开文件表 复制了文件控制块的信息等;

进程级打开文件表 保存了指向系统级文件表的指针及其他信息。


系统级文件表每一项都保存一个计数器(该文件打开的次数)。当我们打开一个文件时,系统首先查看该文件是否已在系统级文件表中,如果已经存在就把该项的计数器加一,如果不在则创建该项信息。

当我们关闭一个文件时,该文件对应的计数器会减1,当减到0时,系统将系统级文件表中的项删除。


进程打开一个文件时,会在进程级文件表中添加一项。每项的信息包括当前文件偏移量(读写文件的位置)、存取权限、一个指向系统级文件表中对应文件项的指针。


FILE结构体中的_file成员应该是指向进程级打开文件表,然后,通过进程级打开文件表可以找到系统级打开文件表,进而可以通过FCB操作物理磁盘上面的文件。系统级文件表中的每一项通过文件描述符(一个非负整数)来标识。