【问题标题】:Why does C use FILE for stdin/stdout streams as well as file operations?为什么 C 将 FILE 用于标准输入/标准输出流以及文件操作?
【发布时间】:2021-11-18 10:52:36
【问题描述】:

我最近查看了 C 中的文件和输入/输出,并很快发现 C 使用称为 FILEtypedefed 结构,通常表示为指向结构的指针。
此结构包含有关输入和输出的数据,因此操作系统和内核的较低级别部分可以轻松管理系统上的输入和输出,例如输入数据的大小、数据类型等。
基本上它是故意抽象的,因为它的工作方式非常低级。

我也知道像 FILE* x 这样的东西通常被 C 程序员用来表示输入和输出流。 C 还允许FILE 通常用于指向文件。

为什么 C 允许程序员使用FILE 来表示文件以及输入/输出流?对我来说,这听起来很令人困惑,而且关键字FILE 的字面意思是FILE,我认为它经常会让新程序员误以为它仅用于指向文件。

那么为什么FILE 同时用于文件和输入/输出?

【问题讨论】:

  • 因为在 Unix 上“一切都是文件”,而 C 是专门为这个操作系统创建的
  • 基本上是故意抽象的... 对。它是一个抽象的 I/O 流。 FILE 这个名字有点用词不当。您可以使用FILE * 来表示文件、设备、网络流甚至内存中字符串的 i/o。
  • @SteveSummit 所以基本上FILE 可以用来表示计算机上的任何输入/输出设备?因为FILE 链接的结构也考虑了所有输入/输出设备?
  • @programme3219873 最初,FILE * 是 Unix 文件描述符之上的缓冲方案的“句柄”。实际上,Unix 文件描述符指的是可以“解释所有输入/输出设备”的数据结构。据我所知,这通常仍然是今天的实现方式,尽管它可以有自己的间接级别来处理不同的“设备”。 (通常,FILE * 级别的唯一间接级别是在 i/o 到 Unix 文件描述符之间,而不是在 i/o 到字符串之间。)
  • @programme3219873:FILE 表示字节流,而不是设备。字节流是字节流,无论该流的源或目标是文件、打印机还是网络流。

标签: c file file-io


【解决方案1】:

在许多系统(如 Linux)中(几乎)一切都是文件。终端、网卡、随机数生成器、设备树等等。流(或文件)对于几乎任何东西都是一个非常好的抽象 :)

【讨论】:

    【解决方案2】:

    在Linux系统上,可以学习GNU glibc的源码。它是开源代码。

    然后将FILE 定义为指向某个struct 的指针,其中包含打开的文件描述符编号、某个缓冲区等...

    短名称FILE 具有历史意义。在 Unix 计算机的内存不足 256 KB 和几兆字节的旋转硬盘的时代发明。在History of Unix 上阅读维基百科。

    【讨论】:

      【解决方案3】:

      C中,程序员可以为他们的数据存储创建、打开、关闭文本或二进制文件。

      file 代表一个字节序列,无论它是文本文件还是二进制文件。 c programming language 提供对高级功能的访问以及处理存储设备上文件的低级(操作系统级别)调用。

      【讨论】:

        【解决方案4】:

        因为FILE 命名错误,它不代表文件。它代表可以读取和写入的东西。可以以单个字符大小(流)或批量(块)进行读取和写入。

        如果你想要键盘输入,为什么不从键盘缓冲区读取呢?如果你想发送一个网络请求,为什么不写一个到出站网络缓冲区呢?你会用什么来做到这一点?

        一旦 UNIX 和 C 的设计者意识到许多项目的核心共同特性集是读写能力,他们就将这种模式重用于人们不考虑文件的许多事情。这就是 UNIX 的“一切都是文件”口头禅背后的动机。目录是文件,包含其他文件的名称和位置。磁盘是文件,期待遵循文件系统布局约束的写入。屏幕是文件,需要终端控制代码和文本。

        文件发生了什么,这个强大想法的开始?它们仍然存在,但是 C 中的 FILE 构造更多的是内核中的 ID,用于可能读取或写入的东西,并且不能保证回到磁盘上文件的常规概念.

        【讨论】:

        • 重命名它的唯一问题是我们真的不知道它应该命名什么。 Stream 暗示如何使用它,许多FILE 句柄是使用基于块的传输访问的。
        • 惊人的答案谢谢
        • Re "* Stream 暗示如何使用它*",这就是为什么它是一个好名字的原因。句柄是使用基于块的传输访问的。 /// Re "and many FILE handles are access using block based transfer.", 在数以百万计的流中,我从未使用过这样的流,所以说“很多”是一个巨大的夸张.无论如何,这一点是完全错误的。流并不意味着字节。 Streams 经常用于字节以外的事物(视频帧、水等)。关键是它是一个长度可能不确定的序列。
        • 流意味着有序阅读。文件句柄可以做得更多。他们可以根据偏移量进行读取。他们可以重置回到开始。 Stream 并不是一个坏名字,只是它已经在更狭窄的环境中使用过。
        【解决方案5】:

        尽管有它的名字,FILE 与文件无关。例如,您不能使用FILE 重命名。您不能使用 FILE 删除。

        FILE 总是代表一个流。这个流是否与普通文件、管道或套接字相关联无关紧要。

        【讨论】:

        • 那么这是否意味着FILE 只是一种可用于表示计算机上任何输入/输出设备的对象类型?因为FILE 链接的结构也考虑了所有输入/输出设备?
        • 不,它是用来表示一个流的。它也与设备无关。
        • “流”到底是什么意思?
        • 它实际上不是一个流,更像是一个可能可读/可能写的标识符。所有块设备也都通过文件访问,流意味着一个字符设备。
        • 关于““流”到底是什么意思?”,“流是数据的源或接收器,通常是单个字节或字符。” Stream
        猜你喜欢
        • 2012-08-03
        • 1970-01-01
        • 2013-11-06
        • 1970-01-01
        • 2023-03-15
        • 2013-09-18
        • 2013-02-16
        • 2019-11-22
        • 1970-01-01
        相关资源
        最近更新 更多