C中的FILE关键字究竟是什么?

joh*_*ter 24 c file stdio

我已经开始学习一些C作为一种爱好并且已经盲目地使用FILE作为文件指针的声明很长一段时间了,我一直在想.这是C的关键字或特殊数据类型来处理文件吗?它是否包含文件内的流和其他数据?为什么它被定义为指针?

一个例子来说明我的意思,使其更清晰:

FILE* fp; //<-- this
fp = fopen("datum.txt", "r");

while(!feof(fp)) {
   // etc.
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*der 35

这是C用于处理文件的关键字或特殊数据类型吗?

你所指的是一个typedef'd结构,它由标准的io库用来保存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;
Run Code Online (Sandbox Code Playgroud)

其中包括可爱的评论:

有些人认为,正确思想中没有人应该利用这种结构的内部结构.

这个结构的内容似乎在其他实现上有很大的改变,glibc源通常有某种形式的注释,但是它们的结构在很多代码下被掩盖了.

注意上述警告是有意义的,不要担心它的作用.:)

  • 你不需要一个指针来传递`struct`.它是指针的原因是隐藏结构.这是实现`private`类成员的C方式.这正是没有人会尝试使用结构本身,因为标准没有定义结构,它只需要指向它的指针.如前所述 - 它被称为**不透明**类型. (3认同)

Jen*_*ens 8

FILE是一个用作typedef名称的标识符,通常用于a struct.stdio库通常有类似的东西

typedef struct {
   ...
} FILE;
Run Code Online (Sandbox Code Playgroud)

某处.处理FILE指针的所有stdio函数都知道...并且可以访问结构成员.在C程序员必须使用类似功能fopen,feof,ferror,ungetc等上创建和文件结构进行操作.这些类型称为不透明(即您无法窥视它们但必须使用访问器功能).

为什么它被定义为指针?

事实并非如此.它是您的代码声明指针的结构.注意你的星号

FILE* fp;
Run Code Online (Sandbox Code Playgroud)

这是为什么星号应该带有变量标识符而不是类型名称的另一个例子:

FILE *fp;
Run Code Online (Sandbox Code Playgroud)

  • @IllidanS4 考虑`FILE* fp1, fp2;`它*看起来*好像fp1和fp2是相同的类型,但它们不是。这是一个欺骗性的声明。 (2认同)