Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指向缓冲区的指针和指向文件的指针有什么区别?_C_File_Buffer_Stdio - Fatal编程技术网

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

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

在“C编程:现代方法”的第22章中,解释了
标题的基础知识

一个让我有点困惑的细节是指向缓冲区的指针和指向文件的指针(表示为
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