文件指针
在C语言中,通过文件指针可以对文件进行相应的操作,定义说明文件指针的一般形式为:FILE *指针变量标识符。
FILE实际是由系统定义的一个结构体,它包含的字段有文件描述符和缓冲区等。
通常程序运行后会打开:stdin--文件输入流,stdout--文件输出流,stderr--文件错误流,它们对应了键盘、显示器、显示器,它们的类型都为FILE*。
由于fwrite,printf都有缓冲区,而缓冲区由C语言提供,主要影响读写,所以FILE结构体中包含了缓冲区字段。
FILE结构体:
#include<stdio.h>
struct _iobuf {
char *_ptr; //文件输入的下一个位置
int _cnt; //当前缓冲区的相对位置
char *_base; //指基础位置(即是文件的其始位置)
int _flag; //文件标志
int _file; //文件的有效性验证
int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取
int _bufsiz; //文件的大小
char *_tmpfname; //临时文件名
};
typedef struct _iobuf FILE;
文件描述符fd
内核利用文件描述符fd(file descriptor)来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。
每个程序运行时,都会打开stdin,stdout,stderr,它们对应的文件描述符依次为0,1,2,而文件描述符从当前未被使用的最小文件描述符开始依次使用,所以一般程序运行后,新建文件的文件描述符会从3开始使用。
每个进程在进程控制块PCB中都有一个文件描述符表,文件描述符fd是张表的索引,这张表的每个表项都有一个指向已打开文件的指针,而已打开的文件在内核中使用FILE结构体表示。
文件描述符表:
文件指针和文件描述符的区别
文件描述符fd:只要打开文件,就会获得一个非负整数的文件描述符fd。
文件指针FILE:进程在PCB中通过fd找到它所指向的文件指针FILE*,而文件指针指向进程中的FILE结构体,它包含文件描述符和缓冲区等字段。
所以,它们是完全不同的。