我已经开始学习一些C作为一种爱好,并且已经盲目地使用FILE作为文件指针的声明相当长一段时间了,我一直在想。这是 C 用来处理文件的关键字或特殊数据类型吗?它是否包含文件内的流和其他数据?为什么定义为指针?
举一个例子来说明我的意思,让它更清楚一点:
FILE* fp; //<-- this
fp = fopen("datum.txt", "r");
while(!feof(fp)) {
// etc.
}
这是 C 用来处理文件的关键字或特殊数据类型吗?
您所指的是标准 io 库使用的 typedef 结构,用于保存 fopen 及其函数系列使用的适当数据。
为什么定义为指针?
使用指向结构的指针,您可以将其作为参数传递给函数。例如,这是 fgets 或 fgetc 所接受的,形式为
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 源代码通常有某种形式的注释,但其结构隐藏在大量代码下。
注意上述警告是有意义的,而不必担心它会做什么。 :)
FILE
是用作 typedef 名称的标识符,通常用于 struct
。
stdio 库通常有类似的东西
typedef struct {
...
} FILE;
某处。所有处理 FILE 指针的 stdio 函数都知道
...
的内容,并且可以访问结构成员。 C 程序员必须使用 fopen
、feof
、ferror
、ungetc
等函数来创建和操作 FILE 结构。此类类型称为 opaque (即您无法查看它们内部,但必须使用访问器函数)。
为什么定义为指针?
事实并非如此。它是一个结构体,your代码声明了一个指针。请注意您的
中的星号FILE* fp;
这是为什么星号应该与变量标识符一起使用而不是类型名称的另一个例子:
FILE *fp;
它不是关键字,它是 ANSI C 标准中定义的用于操作文件的数据类型。它通常指向向库函数描述文件及其当前状态的内部结构。
它是一种特殊的数据类型。它包含一个文件句柄以及各种 stdio 调用内部使用的各种标志。您永远不需要真正知道其中的内容,只需知道它是您可以传递的数据类型即可。
https://cplusplus.com/reference/cstdio/FILE/
但是,如果您有兴趣,请看下面的内容: