C中的FILE关键字究竟是什么?
我已经开始学习一些C作为一种爱好并且已经盲目地使用FILE作为文件指针的声明已经有一段时间了,我一直在想。 这是C的关键字或特殊数据类型来处理文件吗? 它是否包含文件内的流和其他数据? 为什么它被定义为指针?
一个例子来说明我的意思,使其更清晰:
FILE* fp; //<-- this fp = fopen("datum.txt", "r"); while(!feof(fp)) { // etc. }
这是C用于处理文件的关键字或特殊数据类型吗?
您所指的是标准io库使用的typedef’d结构,用于保存fopen及其函数系列的相应数据。
为什么它被定义为指针?
使用指向结构的指针,然后可以将其作为参数传递给函数。 这是例如fgets或fgetc将以function(FILE* fp)
的forms接受的内容function(FILE* fp)
fopen函数将返回一个指向新创建的FILE结构的指针,将这个新指针指向未使用的指针将使它们指向同一个东西。
它是否包含文件内的流和其他数据?
结构定义似乎比其描述更具幻想性。 这直接来自我的stdio.h,来自MinGW32 5.1.4
typedef struct _iobuf { char* _ptr; int _cnt; char* _base; int _flag; int _file; int _charbuf; int _bufsiz; char* _tmpfname; } FILE;
其中包括可爱的评论:
有些人认为,正确思想中没有人应该利用这种结构的内部结构。
这个结构的内容在其他实现上似乎发生了很大的变化,glibc源通常有某种forms的注释,但是它们的结构在很多代码下被掩盖了。
注意上述警告是有意义的,不要担心它的作用。 🙂
FILE
是用作typedef名称的标识符,通常用于struct
。 stdio库通常有类似的东西
typedef struct { ... } FILE;
某处。 处理FILE指针的所有stdio函数都知道…的匹配,并且可以访问结构成员。 C程序员必须使用fopen
, feof
, ferror
, ungetc
等函数来创建和操作FILE结构。 这种类型称为不透明 (即你无法窥视它们但必须使用访问器function)。
为什么它被定义为指针?
事实并非如此。 它是您的代码声明指针的结构。 注意你的星号
FILE* fp;
这是为什么星号应该带有变量标识符而不是类型名称的另一个例子:
FILE *fp;
它不是关键字,它是ANSI C标准中定义的用于操作文件的数据类型。 它通常指向一个内部结构,它描述文件及其对库函数的当前状态。
这是一种特殊的数据类型。 它包含一个文件句柄以及各种stdio调用内部使用的各种标志。 你永远不需要真正知道它里面有什么,只是它是你可以传递的数据类型。
http://www.cplusplus.com/reference/clibrary/cstdio/FILE/
但是如果你有兴趣,这就是它的样子: