c语言 - 指向缓冲区的指针和指向文件的指针之间有什么区别?



在">C Programming: A Modern Approach"的第22章中,解释了<stdio.h>标头的基础知识。

让我有点困惑的一个细节是指向缓冲区的指针指向文件的指针(表示为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)作为缓冲区的地址...这大概与指向缓冲区的指针的想法相同。

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

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

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

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

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

术语"stream"和"file"在C中有点混乱。文件是程序之外的东西,它可能是物理设备、磁盘上的文件或操作系统提供的其他一些东西。

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

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

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

最新更新