C中的文件指针指向什么?

Man*_*esh 5 c pointers file stream

我试图理解C中的输入和输出文件。一开始,当我们要打开一个文件进行读取时,我们声明了一个文件指针,如下所示:

FILE *fptr1 = fopen( "filename", "r")
Run Code Online (Sandbox Code Playgroud)

我知道 FILE 是 stdio.h 库中的一个数据结构,它包含有关文件的信息。我也知道 fopen() 函数返回一个 FILE 结构。但是,这就是指针的目的。它只是指向一堆关于文件的信息?我一直在读这个,我听说过“文件流”这个词有点浮动。我知道它是一个与文件通信的接口(觉得很模糊,但我会接受)。这就是指针指向的简单术语 - 文件流吗?在上面的代码示例中,指针是否指向输入文件流?

谢谢!

Aco*_*orn 6

FILE结构旨在是不透明的。换句话说,如果你想让你的程序保持可移植性,你不应该研究它。

此外,FILE始终通过指针使用,因此您甚至不需要知道它的大小。

在某种程度上,您可以void *出于所有意图和目的考虑它。


现在,如果您真的对FILE类型可能包含的内容感兴趣,C 标准本身就很好地解释了它!参见 C11 7.21.1p2:

(...)FILE它是一种对象类型,能够记录控制流所需的所有信息,包括其文件位置指示符、指向其关联缓冲区的指针(如果有)、记录读/写错误的错误指示符已发生,以及记录是否已到达文件末尾的文件结束指示符;(……)

所以如你所见,至少它包含以下内容:

  • 文件内的位置
  • 指向缓冲区的指针
  • 错误标志
  • EOF 标志

它提到(和你一样)。您可以在 7.21.2 Streams 节中找到有关它的更多详细信息:

输入和输出,无论是来自或来自终端和磁带驱动器等物理设备,还是来自或来自结构化存储设备支持的文件,都被映射为逻辑数据,其属性比其各种输入和输出更统一。支持两种映射形式,文本流二进制流

(……)

二进制流是一个有序的字符序列,可以透明地记录内部数据。(……)

正如我们所读到的,流是一个有序的字符序列。请注意,它并没有说明这个序列是否有限!(稍后会详细介绍)

那么,它们与文件有什么关系呢?让我们看看第 7.21.3 节文件:

流通过打开文件与外部文件(可能是物理设备)相关联,这可能涉及创建新文件。如有必要,创建现有文件会导致其先前的内容被丢弃。如果文件可以支持定位请求(例如磁盘文件,而不是终端),则文件位置指示器与流关联的位置位于文件的起始字符号零),除非文件以追加模式打开,在这种情况下,文件位置指示符最初位于文件的开头还是结尾是实现定义的. 文件位置指示器由后续读取、写入和定位请求维护,以促进文件的有序进展。

(……)

看,当您打开“磁盘文件”(计算机中的典型文件)时,您正在关联一个“流”(在这种情况下是有限的),您可以通过fread()和相关的方式打开/读取/写入/关闭/...职能; 保存有关它的所有必需信息的数据结构是FILE.

但是,还有其他类型的文件。想象一个伪随机数生成器。您可以将其概念化为一个无限的只读文件:每次读取它都会给您一个不同的值,并且它永远不会“结束”。因此,该文件将具有与之关联的无限流。并且某些操作可能对它没有意义(例如,您可能无法搜索它,即移动文件位置指示器)。


这仅用作快速介绍,但正如您所见,该FILE结构是对文件概念的抽象。如果您想更多地了解这类事情,最好的办法就是找到一本关于操作系统的好书,例如Tanenbaum 的现代操作系统。这本书也提到了C,所以更好。