【问题标题】:What exactly is the FILE keyword in C?C 中的 FILE 关键字究竟是什么?
【发布时间】:2011-08-06 01:50:12
【问题描述】:

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

一个例子来说明我的意思,让它更清楚一点:

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

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

【问题讨论】:

标签: c file stdio


【解决方案1】:

这是 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 源代码通常有某种形式的注释,但是它们的结构隐藏在很多代码下。

注意上述警告是有意义的,而不必担心它会做什么。 :)

【讨论】:

  • 我的第一个问题和一个很好的答案,感谢您的意见!这确实澄清了一些事情。
  • 您不需要指针来传递struct。它是指针的原因是隐藏结构。这是实现private 类成员的C 方式。这正是因为没有人会尝试使用结构本身,因为标准没有定义结构,它只需要一个指向它的指针。如前所述 - 它被称为 opaque 类型。
  • @littleadv 我想知道two 声明中的哪一个实际上是关于FILE 在标准中可用的。无论如何,提到FILE 指针,但没有定义它实际上是什么/它的行为方式是什么?看起来很奇怪,就像使用标题中的函数但标题在任何地方都不可用?
  • 我已经在我的 GCC 目录中寻找这个结构定义 20 分钟,并且我一直在浏览我们运行 C 项目的大学服务器。我在两者上都找到了 stdio.h (有趣的是,它们都没有在实际的 GCC 目录中),而且没有一个对这个结构有定义。在 RedHat 和 Mint 操作系统上可以找到它们的任何线索?
  • @littleadv 指针不会使类型不透明。为了使其不透明,应将其强制转换为 void*。您所说的是使用不完整类型的能力,这确实是指针允许的能力。但是,如果标准头文件中提供了 FILE 类型的内部定义,那么使用指针将不会提供不透明度。
【解决方案2】:

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

typedef struct {
   ...
} FILE;

某处。所有处理 FILE 指针的 stdio 函数都知道... 的内容,并且可以访问结构成员。 C 程序员必须使用fopenfeofferrorungetc 等函数来创建和操作 FILE 结构。此类类型称为不透明(即,您不能窥视它们,但必须使用访问器函数)。

为什么定义为指针?

不是。这是一个 your 代码向其声明指针的结构。注意你的星号

FILE* fp;

这是为什么星号应该与变量标识符而不是类型名称一起使用的另一个示例:

FILE *fp;

【讨论】:

  • 这更有意义,我以前根本不知道什么是不透明类型。谢谢!
  • 我没有看到将星号与变量标识符放在一起的论据。
  • @IllidanS4 考虑FILE* fp1, fp2;看起来 好像 fp1 和 fp2 是同一类型,但它们不是。这是一个欺骗性的声明。
  • 是的,这是一个有效的论点,但原始示例并未暗示它。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    不过,如果您有兴趣,可以看看它的样子:

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

    【讨论】:

    • 谢谢你提供这些链接,我希望我能加一个。
    • After more than 19 years, and over two million questions answered, AllExperts.com is now closed. We apologize for any inconvenience.Here 是写答案时它可能看起来的快照。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 2012-05-17
    • 2011-06-28
    • 2019-08-12
    • 2014-10-28
    • 2012-08-27
    相关资源
    最近更新 更多