FILE 结构旨在不透明。换句话说,如果您希望您的程序保持可移植性,您不应该研究它。
此外,FILE 始终通过指针使用,因此您甚至不需要知道它的大小。
在某种程度上,您可以将其视为 void * 用于所有意图和目的。
现在,如果您真的对 FILE 类型 可能包含的内容感兴趣,C 标准本身就很好地解释了它!见 C11 7.21.1p2:
(...) FILE 这是一种对象类型,能够记录控制流所需的所有信息,包括其文件位置指示符、指向其关联缓冲区的指针(如果有)、错误记录是否发生读/写错误的指示符,以及记录是否已到达文件末尾的文件结束指示符; (...)
如您所见,至少它包含以下内容:
- 文件内的位置
- 指向缓冲区的指针
- 错误标志
- EOF 标志
它提到(和你一样)流。您可以在第 7.21.2 节 Streams 中找到有关它的更多详细信息:
输入和输出,无论是来自终端和磁带驱动器等物理设备,还是来自结构化存储设备支持的文件,都映射为逻辑数据流,其属性更多比它们的各种输入和输出均匀。支持两种形式的映射,文本流和二进制流。
(...)
二进制流是可以透明地记录内部数据的有序字符序列。 (...)
正如我们所读到的,流是一个有序的字符序列。请注意,它并没有说明这个序列是否是有限的! (稍后会详细介绍)
>
那么,它们与文件有什么关系?让我们看看第 7.21.3 节文件:
一个流通过打开一个文件与一个外部文件(可能是一个物理设备)相关联,这可能涉及创建一个新文件。如有必要,创建现有文件会导致其以前的内容被丢弃。如果文件可以支持定位请求(例如磁盘文件,而不是终端),则与流关联的文件位置指示符定位在文件的起始字符号零处,除非文件以附加模式打开,在这种情况下,文件位置指示符最初是位于文件的开头还是结尾是由实现定义的。文件位置指示器由后续的读取、写入和定位请求维护,以促进文件的有序推进。
(...)
看,当您打开“磁盘文件”(计算机中的典型文件)时,您正在关联一个“流”(在这种情况下是有限的),您可以打开/读取/写入/关闭/...通过fread()及相关功能;保存所有所需信息的数据结构是FILE。
但是,还有其他类型的文件。想象一个伪随机数生成器。您可以将其概念化为无限的只读文件:每次读取它都会给您不同的值,并且它永远不会“结束”。因此,该文件将具有与之关联的无限流。并且某些操作可能对它没有意义(例如,您可能无法查找它,即移动文件位置指示器)。
这只是一个简单的介绍,但正如您所见,FILE 结构是对文件概念的抽象。如果你想了解更多关于这类事情的信息,你能做的最好的就是找一本关于操作系统的好书,例如。 Modern Operating Systems from Tanenbaum。这本书还提到了 C,所以更好。