为什么 C 将 FILE 用于 stdin/stdout 流以及文件操作?
Why does C use FILE for stdin/stdout streams as well as file operations?
我最近研究了 C 中的文件和 input/output,并很快发现 C 使用 typedef
ed 结构,称为 FILE
,通常表示为指向结构。
此结构包含有关输入和输出的数据,因此操作系统和内核的较低级别部分可以轻松管理系统上的输入和输出,例如输入数据的大小、数据类型等。
基本上它是有意抽象的,因为它的工作方式非常低级。
我也知道 C 程序员常用类似 FILE* x
的东西来表示输入和输出流。 C 还允许 FILE
通常用于指向文件。
为什么 C 允许程序员使用 FILE
来表示文件以及 input/output 流?对我来说,这听起来很令人困惑,而且关键字 FILE
的字面意思是 FILE
,我认为这通常会使新程序员感到困惑,认为它仅用于指向文件。
那么为什么 FILE
用于文件和 input/output?
尽管名称如此,FILE
与文件无关。例如,您不能使用 FILE
重命名。您不能使用 FILE
.
删除
FILE
总是代表一个流。此流是否与普通文件、管道或套接字相关联是无关紧要的。
在Linux系统上,您可以研究GNU glibc的源代码。它是开源代码。
a FILE
然后被定义为指向某些 struct
的指针,其中包含打开的文件描述符编号、某些缓冲区等...
简称 FILE
是历史悠久的。发明于 Unix 计算机内存不足 256 KB 和几兆字节的旋转硬盘的时代。在 History of Unix.
上阅读维基百科
因为FILE
命名错误,它不代表文件。它代表可以读取和写入的东西。读取和写入可以以单个字符大小(流)或批量(块)完成。
所以如果你想要键盘输入,为什么不从键盘缓冲区中读取呢?如果你想发送一个网络请求,为什么不写一个到出站网络缓冲区呢?你会用什么来做到这一点?
一旦 UNIX 和 C 的设计者意识到许多项目的核心共同特征集是读写能力,他们就将这种模式重用于许多人们不考虑文件的事情。这就是 UNIX“一切皆文件”口号背后的动机。目录是文件,包含其他文件的名称和位置。磁盘是文件,期望写入遵循文件系统布局约束。屏幕是文件,期望终端控制代码和文本。
文件发生了什么变化,这个强大的想法的开始?它们仍然存在,但是 C 中的 FILE
构造更像是内核中的一个 ID,用于可能读取或写入的东西,并且不能保证返回到文件的常规概念在磁盘上。
在C中,程序员可以创建、打开、关闭文本或二进制文件来存储数据。
一个file
表示一个字节序列,不管它是文本文件还是二进制文件。 c programming language
提供对高级功能的访问以及低级(OS 级)调用以处理存储设备上的文件。
在许多系统中(如 Linux)(几乎)一切都是文件。终端、网卡、随机数生成器、设备树等等。流(或文件)是几乎任何东西的一个很好的抽象:)
我最近研究了 C 中的文件和 input/output,并很快发现 C 使用 typedef
ed 结构,称为 FILE
,通常表示为指向结构。
此结构包含有关输入和输出的数据,因此操作系统和内核的较低级别部分可以轻松管理系统上的输入和输出,例如输入数据的大小、数据类型等。
基本上它是有意抽象的,因为它的工作方式非常低级。
我也知道 C 程序员常用类似 FILE* x
的东西来表示输入和输出流。 C 还允许 FILE
通常用于指向文件。
为什么 C 允许程序员使用 FILE
来表示文件以及 input/output 流?对我来说,这听起来很令人困惑,而且关键字 FILE
的字面意思是 FILE
,我认为这通常会使新程序员感到困惑,认为它仅用于指向文件。
那么为什么 FILE
用于文件和 input/output?
尽管名称如此,FILE
与文件无关。例如,您不能使用 FILE
重命名。您不能使用 FILE
.
FILE
总是代表一个流。此流是否与普通文件、管道或套接字相关联是无关紧要的。
在Linux系统上,您可以研究GNU glibc的源代码。它是开源代码。
a FILE
然后被定义为指向某些 struct
的指针,其中包含打开的文件描述符编号、某些缓冲区等...
简称 FILE
是历史悠久的。发明于 Unix 计算机内存不足 256 KB 和几兆字节的旋转硬盘的时代。在 History of Unix.
因为FILE
命名错误,它不代表文件。它代表可以读取和写入的东西。读取和写入可以以单个字符大小(流)或批量(块)完成。
所以如果你想要键盘输入,为什么不从键盘缓冲区中读取呢?如果你想发送一个网络请求,为什么不写一个到出站网络缓冲区呢?你会用什么来做到这一点?
一旦 UNIX 和 C 的设计者意识到许多项目的核心共同特征集是读写能力,他们就将这种模式重用于许多人们不考虑文件的事情。这就是 UNIX“一切皆文件”口号背后的动机。目录是文件,包含其他文件的名称和位置。磁盘是文件,期望写入遵循文件系统布局约束。屏幕是文件,期望终端控制代码和文本。
文件发生了什么变化,这个强大的想法的开始?它们仍然存在,但是 C 中的 FILE
构造更像是内核中的一个 ID,用于可能读取或写入的东西,并且不能保证返回到文件的常规概念在磁盘上。
在C中,程序员可以创建、打开、关闭文本或二进制文件来存储数据。
一个file
表示一个字节序列,不管它是文本文件还是二进制文件。 c programming language
提供对高级功能的访问以及低级(OS 级)调用以处理存储设备上的文件。
在许多系统中(如 Linux)(几乎)一切都是文件。终端、网卡、随机数生成器、设备树等等。流(或文件)是几乎任何东西的一个很好的抽象:)