为什么C语言的FILE类型既用于文件操作,又可表示stdin/stdout等输入输出流?
关于C语言
FILE类型同时适配文件操作和I/O流的设计原因 - 这个命名和设计逻辑完全继承自UNIX操作系统的核心设计理念:一切皆文件。C语言和UNIX系统是同步诞生、互相绑定发展的,UNIX内核层面就把磁盘普通文件、终端输入输出、管道、套接字、设备驱动等所有能进行I/O操作的对象,统一抽象为「文件」,使用相同的系统调用接口进行读写、关闭等操作,
FILE类型作为C标准库对内核I/O抽象的上层封装,自然直接沿用了这个命名逻辑。 - 本质上
FILE结构体封装的是「字节流上下文」,包含了缓冲区地址、读写偏移量、打开模式、错误标记等通用I/O属性,和流的底层对接的是什么实体没有关系。不管你是操作磁盘文件,还是用stdin/stdout/stderr处理终端输入输出,或是用fdopen把网络套接字的文件描述符包装成FILE*使用,站在C程序的视角操作逻辑完全一致,这就是抽象的价值:你不需要关心底层实现,只要用统一的标准库函数就能处理所有I/O场景。 - 新手觉得命名容易混淆,本质是对操作系统的「文件」抽象理解不够,误把「磁盘普通文件」等同于操作系统层面的广义文件。C标准制定时没有额外引入
STREAM之类的新类型名,一方面是为了对齐操作系统的抽象层级降低开发者的学习成本,另一方面也是为了兼容最早的C代码使用习惯。 - 补充说明:你平时写的
FILE* fp本质上操作的就是流,这个流关联的是广义文件实体,只是你最常用的场景是关联磁盘普通文件,才会产生「FILE只对应文件」的误解。
内容的提问来源于stack exchange,提问作者programme3219873
相关产品推荐
相关产品推荐

