指向缓冲区的指针和指向文件的指针有什么区别?

What is the difference between a pointer to a buffer and a pointer to a file?

在“C 编程:一种现代方法”的第 22 章中,解释了 <stdio.h>header 的基础知识。

让我有点困惑的一个细节是 指向缓冲区的指针 指向文件的指针 之间的区别(表示如 FILE *).

考虑以下内容(产生混淆):

fopen 原型为:FILE *fopen(const char * restrict filename, const char * restrict mode).

fflush 原型为 int fflush (FILE *stream)fflush 被描述为刷新文件缓冲区的函数。

setvbuf 原型为 int setvbuf (FILE * restrict stream, char * restrict buf, int mode, size_t size)。作者在描述这个函数的时候,把第二个参数(buf)说成是缓冲区的地址...估计和[=46=是一个思路]指向缓冲区的指针.

首先,根据我的理解(特别是考虑到 fflushsetvbuf 中第一个参数的名称选择),stream 在语义上是等价的到 指向文件 的指针。因此,重要的是,流 不是 文件本身。流是文件的 位置 ,至少是通过虚拟内存表示的(如果这是偏离基础,请更正)。

其次,当一个人打开一个文件时,这相当于创建一个相应的缓冲区(也表示在虚拟内存中)。

起初,由于 fflush 的原型,我的印象是指向文件的指针 实际上 指向缓冲区的指针;考虑到 setvbuf 的原型(它具有指向文件的指针和缓冲区地址的不同参数),这显然是错误的。那么指向文件 指向 的指针到底是什么?

此外,如何获取与给定文件缓冲区相关联的地址(作者尚未显示函数 returns 与打开的文件相关联的缓冲区地址)。

非常感谢任何见解。干杯~

流和文件这两个术语在C语言中有点混乱。文件是程序之外的东西,它可能是物理设备,磁盘上的文件,或操作系统提供的其他东西系统.

流大致上是文件的接口。它主要是在 C 环境中构建的,通过使用各种数据结构来记住有关它所连接的文件的信息,保存正在写入文件或从文件读取的数据等。

由于历史原因,流通过名为 FILE 的数据结构类型进行管理。 FILE * 实际上是指向流的指针(或者更专业地说,是指向用于控制流的数据的指针)。 FILE 中的数据包括文件位置指示符、指向其关联内部缓冲区的指针(不是您应该使用的任何内容)以及有关已发生错误或是否已到达文件末尾的信息。如果名称是 STREAM 而不是 FILE 会更好,但由于历史原因我们只能使用 FILE

缓冲区通常是 charunsigned char 的数组,用于保存在各种事物之间移动的数据,尽管可以有其他类型的缓冲区。 setvbufbuf 参数用于提供与流一起使用的缓冲区。这不是一个常用的例程。将数组传递给 setvbuf 将数组 提供给 C 库以用于该流。该程序应该停止将该数组用于任何其他目的,直到它关闭该流。这不同于使用 getcharfputc.

等其他函数读取或写入字符的数组