文件指针 FILE 的底层实现

来源:互联网 发布:合肥大数据产业峰会 编辑:程序博客网 时间:2024/06/10 23:21

主要内容 :

1、FILE 类型的简介;

2、FIlE结构体的主要内容;

3、FILE内部内容详解;



FILE类型简介

相信大家对于 C语言都不是很陌生的吧!在C语言中有这么个 类型 FIlE *;
FILE类型在C语言中是用来 表示一个文件 打开后的一系列的信息;
简单的来说的话,FILE是一个结构体 ,内部的成员包含的是 一些列的文件操作时的数据;

C语言的stdio.h头文件中,定义了用于文件操作的结构体FILE。这样,我们通过fopen返回一个文件指针(指向FILE结构体的指针)来进行文件操作。

FILE结构体的内容

vs2010中对于FILE结构体的定义如下:

#ifndef _FILE_DEFINEDstruct _iobuf {    char *_ptr; //文件输入的下一个位置    int _cnt; //当前缓冲区的相对位置    char *_base; //指基础位置(即是文件的其始位置)     int _flag; //文件标志       int _file; //文件的有效性验证 也就是是进程中所说的文件的描述符fd    int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取    int _bufsiz; //缓冲区 缓冲的字节个数    char *_tmpfname;//临时文件名        };typedef struct _iobuf FILE;#define _FILE_DEFINED#endif


FILE内部内容详解;

1、文件描述符 

对于FILE结构体中每一个成员变量都是有一定的作用的,例如 :在其中的_file 又被称作是文件描述符 。

在我们需要对文件进行操作的时候,我们只需要知道  一个文件的  文件的描述符  ,就可在硬盘上面找到文件的相关的数据,进而对文件作出相应的操作 。


文件描述符、一般是从0-N的整数中最小的且没有被使用的来表示的数来表示的。


并且 ,系统规定的 三个 标准流(LINUX下一切皆可看成是文件)中的文件描述符如下:

1、标准输入流 :stdio   ---->键盘;    对应的文件描述符   0;
2、标准输出流 :stdout ---->显示器;对应的文件描述符   1;
3、标准错误流 :stderr  ---->显示器;对应的文件描述符   3;

因此,一般情况下,我们每次打开的文件的文件描述符  都是从3开始向上递加的。

2、缓冲区

对于每个FILE结构体来说,内部肯定都会包含一个缓冲区的;

为什么呢?
因为每次的文件的读写操作,都不可能是写入(读出)一个字节的字符,要是每读(写)一个字节的内容,就要调用一下系统的I/O设备的额话,效率可能会低的,所以引入了缓冲区来提高效率。

缓冲区刷新的三种方式:
1、行缓冲  ;
一般的这种缓冲方式,都是遇到一个\n就要刷新一次缓冲区;这样的缓冲方式一般使用在显示器文件上 ;
这是为了满足我们的交互问题 : 
我们大部分的人都会适应的是 每次读一行的,就像是 QQ聊天每次 显示的一行或者是多行的语句;
总不能半天都不刷新,突然又出现一大片的文件来 ;

2、全缓冲  ;
当缓冲区满的时候,系统就会刷新缓冲区,这种方法一般应用在文件的读写上。

3、无缓冲  
没有缓冲区
系统的文件函数就没有缓冲区。
0 0
原创粉丝点击