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

时间:2018-10-14 18:07:19

标签: c file pointers stream

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:3)

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

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

从某种意义上说,您可以将其视为void *,无论出于何种意图和目的。


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

  

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

如您所见,至少它包含类似以下内容的东西:

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

(如您所愿)提及视频流。您可以在7.21.2流中找到有关它的更多详细信息:

  

输入和输出,无论是到终端设备或磁带驱动器之类的物理设备,还是从结构化存储设备上支持的文件进出,都被映射到逻辑数据流中,而这些数据流的属性更多。与其各种投入和产出相比要统一。支持两种形式的映射,分别是文本流二进制流

     

(...)

     

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

我们可以看到,流是字符的有序序列。注意,它没有说这个序列是否有限! (稍后会更多)

那么,它们与文件有何关系?让我们看一下7.21.3文件:

  

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

     

(...)

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

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


这只是一个快速的介绍,但是正如您所看到的,FILE结构是文件概念的抽象。如果您想了解更多有关此类内容的知识,则最好的办法是找到一本有关操作系统的好书,例如Modern Operating Systems from Tanenbaum。本书还提到了C,因此更好。