C语言中文件指针指向啥?

Posted

技术标签:

【中文标题】C语言中文件指针指向啥?【英文标题】:What does a file pointer point to in C?C语言中文件指针指向什么? 【发布时间】:2019-03-19 05:23:24 【问题描述】:

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

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

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

谢谢!

【问题讨论】:

打算是含糊的。这个想法是不同的实现可以做不同的事情,但你不需要关心,因为你只处理FILE * 相关:***.com/q/2423628/694576 指针指向描述打开文件的struct _IO_FILE 见the Standard, C99 7.19。 【参考方案1】:

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,所以更好。

【讨论】:

非常感谢!你的回答很全面!

以上是关于C语言中文件指针指向啥?的主要内容,如果未能解决你的问题,请参考以下文章

请问C语言对文件的读取都有哪些函数,都有啥功能?像fseek();fscanf();fread......啥的

c语言中取地址符和*有啥区别?

在C语言的文件中,像r,w,a,r+,w+,a+分别是啥意思,前面三者与后面三者有啥区别吗?

C语言不允许使用不完整的类型报错是啥意思啊

C语言中stdout是啥意思?

c语言中const 是啥意思,怎么用,啥时候用?