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

时间:2011-04-15 05:32:33

标签: c file stdio

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

举例说明我的意思,使其更清晰:

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

while(!feof(fp)) {
   // etc.
}

4 个答案:

答案 0 :(得分:32)

  

这是C用于处理带有?

文件的关键字或特殊数据类型

您所指的是标准io库使用的typedef'd结构,用于保存适当的数据以供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源通常都有某种形式的注释,但是它们的结构在很多代码下被掩盖了。

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

答案 1 :(得分:8)

FILE是用作typedef名称的标识符,通常用于struct。 stdio库通常有类似

的东西
typedef struct {
   ...
} FILE;

某处。处理FILE指针的所有stdio函数都知道...的匹配,并且可以访问结构成员。 C程序员必须使用fopenfeofferrorungetc等函数来创建和操作FILE结构。这些类型称为 opaque (即你无法窥视它们但必须使用访问器函数)。

  

为什么将它定义为指针?

不是。它是你的代码声明指针的结构。请注意

中的星号
FILE* fp;

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

FILE *fp;

答案 2 :(得分:2)

它不是关键字,它是ANSI C标准中定义的用于操作文件的数据类型。它通常指向一个内部结构,它描述文件及其对库函数的当前状态。

答案 3 :(得分:0)

这是一种特殊的数据类型。它包含一个文件句柄以及各种stdio调用内部使用的各种标志。你永远不需要真正知道它里面有什么,只是它是你可以传递的数据类型。

http://www.cplusplus.com/reference/clibrary/cstdio/FILE/

但是如果你感兴趣的话,这就是它的样子:

http://en.allexperts.com/q/C-1587/2008/5/FILE-Structure.htm