在C语言中,文件指针指向什么?

6

我正在尝试理解C语言中的输入和输出文件。在开始时,当我们想要打开一个文件进行读取时,我们声明一个文件指针如下:

FILE *fptr1 = fopen( "filename", "r")

我知道FILE是stdio.h库中的数据结构,它包含有关文件的信息。我也知道fopen()函数返回一个FILE结构。但是,指针的目的是什么?它只是指向与文件相关的一些信息吗?我一直在研究这个问题,我听说过“文件流”这个术语。我知道它是与文件通信的接口(感觉有点模糊,但我会接受它)。简单来说,指针指向的就是文件流吗?在上面的代码示例中,指针是否指向输入文件流?
谢谢!

它的意图是模糊的。这个想法是不同的实现可以以不同的方式处理事情,但你不需要关心,因为你只处理“FILE *”。 - Dmitri
1
相关链接:https://dev59.com/mXE95IYBdhLWcg3wKq2q - alk
指针指向描述打开文件的struct _IO_FILE - DYZ
请参见标准C99 7.19 - pmg
1个回答

9

FILE结构旨在保持不透明。换句话说,如果您希望程序具有可移植性,则不应查看它。

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

从某种意义上说,您可以将其视为所有目的的void *


现在,如果你真的对于 FILE 类型的内容感兴趣,C标准本身已经很好地解释了它!请参阅C11 7.21.1p2:

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

因此,正如你所看到的,它至少包含以下内容:
  • 文件内的位置
  • 指向缓冲区的指针
  • 错误标志
  • EOF标志
它提到了(就像你所说的)。你可以在第7.21.2节流中找到更多详细信息:

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

(...)

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

我们可以看到,流是一个有序的字符序列。请注意,它并没有说明这个序列是否有限!(稍后再讨论)

那么,它们与文件有何关系?让我们看看第7.21.3节“文件”:

当你打开一个“磁盘文件”(通常是计算机中的文件)时,你就会关联一个“流”(有限的,在这种情况下),你可以通过fread()等相关函数来打开/读取/写入/关闭它,并且保存所有必要信息的数据结构是FILE。打开现有文件会丢弃其以前的内容(如果需要)。如果文件支持定位请求(如磁盘文件,而不是终端),则与流关联的文件位置指示器将定位在文件的起始字符编号零处,除非以追加模式打开文件,在这种情况下,文件位置指示器最初定位在文件的开头或结尾是由实现定义的。文件位置指示器由后续的读取、写入和定位请求维护,以促进对文件的有序进展。
然而,还有其他类型的文件。想象一个伪随机数生成器。你可以将它构想成一个无限只读文件:每次读取它都会给你一个不同的值,而且它永远不会“结束”。因此,该文件将与无限流相关联。而有些操作可能对它没有意义(例如,也许你不能搜索它,即移动文件位置指针)。
这只是一个简要介绍,但是您可以看到,FILE结构是文件概念的抽象。如果您想了解更多关于这方面的知识,最好的方法是阅读一本优秀的操作系统书籍,例如Tanenbaum的现代操作系统。该书还涉及C语言,更好。

1
非常感谢!您的回复非常全面! - Manesha Ramesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接