C 指向缓冲区的指针和指向文件的指针有什么区别?
在“C编程:现代方法”的第22章中,解释了C 指向缓冲区的指针和指向文件的指针有什么区别?,c,file,buffer,stdio,C,File,Buffer,Stdio,在“C编程:现代方法”的第22章中,解释了标题的基础知识 一个让我有点困惑的细节是指向缓冲区的指针和指向文件的指针(表示为file*)之间的区别 考虑以下因素(由此产生混淆): fopen的原型为:FILE*fopen(const char*restrict filename,const char*restrict mode) fflush原型为intfflush(文件*流)fflush被描述为刷新文件缓冲区的函数 setvbuf原型为int-setvbuf(文件*restrict-stream
标题的基础知识
一个让我有点困惑的细节是指向缓冲区的指针和指向文件的指针(表示为file*
)之间的区别
考虑以下因素(由此产生混淆):
fopen
的原型为:FILE*fopen(const char*restrict filename,const char*restrict mode)
fflush
原型为intfflush(文件*流)
fflush
被描述为刷新文件缓冲区的函数
setvbuf
原型为int-setvbuf(文件*restrict-stream,字符*restrict-buf,int-mode,size\u-t-size)
。当作者描述这个函数时,他引用第二个参数(buf
)作为缓冲区的地址……这大概与指向缓冲区的指针的想法相同
首先,根据我的理解(特别是考虑到fflush
和setvbuf
中第一个参数的名称选择),流在语义上等同于指向文件的指针。因此,重要的是,流不是文件本身。流是文件的位置,至少是通过虚拟内存表示的(如果这是不正确的,请更正)
其次,当打开一个文件时,这相当于创建一个相应的缓冲区(也在虚拟内存中表示)
起初,由于fflush
的原型,我觉得指向文件的指针实际上就是指向缓冲区的指针;这显然是错误的,因为setvbuf
的原型(具有指向文件的指针和缓冲区地址的不同参数)。那么,指向文件的指针指向的是什么呢
此外,如何获取与给定文件的缓冲区关联的地址(作者尚未显示函数,但返回与打开的文件关联的缓冲区的地址)
非常感谢您的任何见解。Cheers ~在C语言中,“流”和“文件”这两个术语有点混乱。文件是程序之外的东西,它可能是物理设备、磁盘上的文件或操作系统提供的其他东西 流大致上是文件的接口。它主要是在C环境中构建的,通过使用各种数据结构来记住与它连接的文件有关的信息,保存写入文件或从文件读取的数据,等等 出于历史原因,流是通过名为
FILE
的数据结构类型进行管理的。文件*
实际上是指向流的指针(或者更严格地说,是指向用于控制流的数据的指针)。文件中的数据
包括文件位置指示器、指向其相关内部缓冲区的指针(不是您应该使用的任何内容)以及有关已发生错误或是否已到达文件结尾的信息。如果名称是STREAM
而不是FILE
,那就更好了,但是由于历史原因,我们一直使用FILE
缓冲区通常是
char
或unsigned char
的数组,用于保存在不同对象之间移动的数据,但也可以有其他类型的缓冲区。setvbuf
的buf
参数用于提供与流一起使用的缓冲区。这不是一个常用的例行程序。将数组传递给setvbuf
会将该数组提供给C库以用于该流。程序应该停止将数组用于任何其他目的,直到它关闭该流为止。这与使用其他函数(如getchar
或fputc
)读取或写入字符时使用的数组不同,C中的术语“流”和“文件”有点混乱。文件是程序之外的东西,可能是物理设备,也可能是磁盘上的文件,或者操作系统提供的其他东西
流大致上是文件的接口。它主要是在C环境中构建的,通过使用各种数据结构来记住与它连接的文件有关的信息,保存写入文件或从文件读取的数据,等等
出于历史原因,流是通过名为FILE
的数据结构类型进行管理的。文件*
实际上是指向流的指针(或者更严格地说,是指向用于控制流的数据的指针)。文件中的数据
包括文件位置指示器、指向其相关内部缓冲区的指针(不是您应该使用的任何内容)以及有关已发生错误或是否已到达文件结尾的信息。如果名称是STREAM
而不是FILE
,那就更好了,但是由于历史原因,我们一直使用FILE
缓冲区通常是
char
或unsigned char
的数组,用于保存在不同对象之间移动的数据,但也可以有其他类型的缓冲区。setvbuf
的buf
参数用于提供与流一起使用的缓冲区。这不是一个常用的例行程序。将数组传递给setvbuf
会将该数组提供给C库以用于该流。程序应该停止将数组用于任何其他目的,直到它关闭该流为止。这与使用其他函数(如getchar
或fputc
)读取或写入字符时使用的数组不同fflush被描述为刷新文件缓冲区的函数,该函数未将参数描述为fflush
。它描述了fflush
的功能。所以在描述中的“缓冲区”是d