首页 > 解决方案 > 指向缓冲区的指针和指向文件的指针有什么区别?

问题描述

在“ 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作者在描述这个函数时,将第二个参数

首先,据我了解(特别是考虑到fflushand中第一个参数的名称选择setvbuf),在语义上等同于指向文件的指针。因此,重要的是,流不是文件本身。流是文件的位置,至少是通过虚拟内存表示的(如果这不符合标准,请更正)。

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

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

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

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

标签: cfilebufferstdio

解决方案


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

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

由于历史原因,流是通过称为FILE. AFILE *实际上是指向流的指针(或者,更专业地说,是指向用于控制流的数据的指针)。a 中的数据FILE包括文件位置指示符、指向其关联的内部缓冲区的指针(不是您应该使用的任何内容)以及有关已发生错误或是否已到达文件末尾的信息。如果名字是STREAM而不是更好,但由于历史原因FILE,我们被困住了。FILE

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


推荐阅读