指向缓冲区的指针和指向文件的指针有什么区别?
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=是一个思路]指向缓冲区的指针.
首先,根据我的理解(特别是考虑到 fflush
和 setvbuf
中第一个参数的名称选择),stream 在语义上是等价的到 指向文件 的指针。因此,重要的是,流 不是 文件本身。流是文件的 位置 ,至少是通过虚拟内存表示的(如果这是偏离基础,请更正)。
其次,当一个人打开一个文件时,这相当于创建一个相应的缓冲区(也表示在虚拟内存中)。
起初,由于 fflush
的原型,我的印象是指向文件的指针 实际上 指向缓冲区的指针;考虑到 setvbuf
的原型(它具有指向文件的指针和缓冲区地址的不同参数),这显然是错误的。那么指向文件 指向 的指针到底是什么?
此外,如何获取与给定文件缓冲区相关联的地址(作者尚未显示函数 returns 与打开的文件相关联的缓冲区地址)。
非常感谢任何见解。干杯~
流和文件这两个术语在C语言中有点混乱。文件是程序之外的东西,它可能是物理设备,磁盘上的文件,或操作系统提供的其他东西系统.
流大致上是文件的接口。它主要是在 C 环境中构建的,通过使用各种数据结构来记住有关它所连接的文件的信息,保存正在写入文件或从文件读取的数据等。
由于历史原因,流通过名为 FILE
的数据结构类型进行管理。 FILE *
实际上是指向流的指针(或者更专业地说,是指向用于控制流的数据的指针)。 FILE
中的数据包括文件位置指示符、指向其关联内部缓冲区的指针(不是您应该使用的任何内容)以及有关已发生错误或是否已到达文件末尾的信息。如果名称是 STREAM
而不是 FILE
会更好,但由于历史原因我们只能使用 FILE
。
缓冲区通常是 char
或 unsigned char
的数组,用于保存在各种事物之间移动的数据,尽管可以有其他类型的缓冲区。 setvbuf
的 buf
参数用于提供与流一起使用的缓冲区。这不是一个常用的例程。将数组传递给 setvbuf
将数组 提供给 C 库以用于该流。该程序应该停止将该数组用于任何其他目的,直到它关闭该流。这不同于使用 getchar
或 fputc
.
等其他函数读取或写入字符的数组
在“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=是一个思路]指向缓冲区的指针.
首先,根据我的理解(特别是考虑到 fflush
和 setvbuf
中第一个参数的名称选择),stream 在语义上是等价的到 指向文件 的指针。因此,重要的是,流 不是 文件本身。流是文件的 位置 ,至少是通过虚拟内存表示的(如果这是偏离基础,请更正)。
其次,当一个人打开一个文件时,这相当于创建一个相应的缓冲区(也表示在虚拟内存中)。
起初,由于 fflush
的原型,我的印象是指向文件的指针 实际上 指向缓冲区的指针;考虑到 setvbuf
的原型(它具有指向文件的指针和缓冲区地址的不同参数),这显然是错误的。那么指向文件 指向 的指针到底是什么?
此外,如何获取与给定文件缓冲区相关联的地址(作者尚未显示函数 returns 与打开的文件相关联的缓冲区地址)。
非常感谢任何见解。干杯~
流和文件这两个术语在C语言中有点混乱。文件是程序之外的东西,它可能是物理设备,磁盘上的文件,或操作系统提供的其他东西系统.
流大致上是文件的接口。它主要是在 C 环境中构建的,通过使用各种数据结构来记住有关它所连接的文件的信息,保存正在写入文件或从文件读取的数据等。
由于历史原因,流通过名为 FILE
的数据结构类型进行管理。 FILE *
实际上是指向流的指针(或者更专业地说,是指向用于控制流的数据的指针)。 FILE
中的数据包括文件位置指示符、指向其关联内部缓冲区的指针(不是您应该使用的任何内容)以及有关已发生错误或是否已到达文件末尾的信息。如果名称是 STREAM
而不是 FILE
会更好,但由于历史原因我们只能使用 FILE
。
缓冲区通常是 char
或 unsigned char
的数组,用于保存在各种事物之间移动的数据,尽管可以有其他类型的缓冲区。 setvbuf
的 buf
参数用于提供与流一起使用的缓冲区。这不是一个常用的例程。将数组传递给 setvbuf
将数组 提供给 C 库以用于该流。该程序应该停止将该数组用于任何其他目的,直到它关闭该流。这不同于使用 getchar
或 fputc
.