如何在C99标准下实现fdopen功能?
从文件描述符获取FILE*的C99标准方案
C99标准本身没有提供从文件描述符(file descriptor)获取FILE*的原生函数——原因很简单:open()这类文件描述符操作接口本身就不属于C99标准,而是POSIX的扩展接口。C99的文件IO体系完全围绕FILE*设计,比如fopen()、fgets()等函数。
如果要严格遵循C99标准,你有两种可行思路:
- 替换
open()为C99标准的fopen():直接通过fopen()打开文件得到FILE*,后续直接使用fgets(),完全符合C99规范。 - 自行封装类似
fdopen()的逻辑:但这需要依赖平台特定的FILE结构实现细节,无法做到跨平台且严格符合C99标准(因为C99只规定FILE是不透明结构,具体内部成员由编译器实现定义)。
额外提醒:open()的无缓冲/手动缓冲模型和fopen()的标准缓冲模型差异很大,即使自行封装,也要注意处理缓冲同步问题,避免数据读写不一致。
如果你的场景允许接受编译器扩展,很多支持C99的编译器(如GCC)在开启C99标准模式时,依然支持fdopen()作为扩展接口,但这已经不属于严格的C99标准范畴。
内容的提问来源于stack exchange,提问作者Tyler Durden
相关产品推荐
相关产品推荐

