c - 指向缓冲区的指针和指向文件的指针有什么区别?
问题描述
在“ C 编程:一种现代方法<stdio.h>
”的第 22 章中,解释了标头的基础知识。
一个让我有点困惑的细节是指向缓冲区的指针和指向文件的指针(表示为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
作者在描述这个函数时,将第二个参数(
首先,据我了解(特别是考虑到fflush
and中第一个参数的名称选择setvbuf
),流在语义上等同于指向文件的指针。因此,重要的是,流不是文件本身。流是文件的位置,至少是通过虚拟内存表示的(如果这不符合标准,请更正)。
其次,当一个人打开一个文件时,这相当于创建一个相应的缓冲区(也表示在虚拟内存中)。
起初,由于fflush
的原型,我的印象是指向文件的指针实际上是指向缓冲区的指针;setvbuf
鉴于原型(它具有指向文件的指针和缓冲区地址的不同参数),这显然是错误的。那么指向文件的指针到底是什么?
此外,如何获取与给定文件的缓冲区关联的地址(作者尚未展示函数,但返回与打开的文件关联的缓冲区的地址)。
非常感谢任何见解。干杯~
解决方案
术语“流”和“文件”在 C 中有点混乱。文件是程序之外的东西,它可能是物理设备、磁盘上的文件或操作系统提供的其他东西。
流大致是文件的接口。它主要是在 C 环境中构建的,通过使用各种数据结构来记住有关它所连接的文件的信息,保存正在写入或从文件读取的数据,等等。
由于历史原因,流是通过称为FILE
. AFILE *
实际上是指向流的指针(或者,更专业地说,是指向用于控制流的数据的指针)。a 中的数据FILE
包括文件位置指示符、指向其关联的内部缓冲区的指针(不是您应该使用的任何内容)以及有关已发生错误或是否已到达文件末尾的信息。如果名字是STREAM
而不是更好,但由于历史原因FILE
,我们被困住了。FILE
缓冲区通常是一个数组char
或unsigned char
用于保存在各种事物之间移动的数据,尽管可以有其他类型的缓冲区。buf
to 参数setvbuf
用于提供要与流一起使用的缓冲区。这不是一个常用的例程。传递一个数组以setvbuf
将数组提供给 C 库以用于该流。程序应该停止将数组用于任何其他目的,直到它关闭该流。这与您使用其他函数(如getchar
or )读取或写入字符的数组不同fputc
。
推荐阅读
- html - 在 :hover 上设置动画 ::before 内容
- java - 为什么 JSoup 会创建以链接命名的空文件?
- java - Kotlin LocalDateTime 为 Long
- python - 使用 BeautifulSoup 进行抓取,其中键标记为 /strong,值是纯文本和/或标记
- reactjs - 将 React Photo Gallery 与图像文件一起使用,而不是来自 URL 的图像
- javascript - 如果一个函数被执行 5 次,则解决一个 Promise
- javascript - Bootstrap 冲突与自定义 CSS 过渡 - 如何查找 + 修复冲突的 CSS 规则?
- javascript - 有时 InvalidArgumentError: 'handle' 必须是字符串
- c# - 找不到记录时 SQL Server 显示结果
- python - 将包含字典的 pandas 列转换为多行