是否有任何理由(除了句法的)你想使用
FILE *fdopen(int fd, const char *mode);
或者
FILE *fopen(const char *path, const char *mode);
代替
int open(const char *pathname, int flags, mode_t mode);
在 Linux 环境中使用 C 时?
原文由 LJM 发布,翻译遵循 CC BY-SA 4.0 许可协议
1 回答670 阅读✓ 已解决
3 回答545 阅读✓ 已解决
1 回答765 阅读✓ 已解决
1 回答1.3k 阅读
1 回答961 阅读
2 回答487 阅读✓ 已解决
1 回答799 阅读
首先,没有特别好的理由使用
fdopen
如果fopen
是一个选项,而open
是另一个可能的选择。如果你想要一个FILE *
,你不应该首先使用open
打开文件。因此,在该列表中包含fdopen
是不正确且令人困惑的,因为它与其他列表不太相似。我现在将继续忽略它,因为这里的重要区别在于 C 标准FILE *
和特定于操作系统的文件描述符之间。使用
fopen
而不是open
有四个主要原因。fopen
为您提供缓冲 IO,结果可能比您正在使用的open
。fopen
如果文件未以二进制模式打开,则进行行尾转换,如果您的程序曾经被移植到非 Unix 环境,这将非常有帮助(尽管世界似乎正在趋向于仅 LF (除了 IETF 基于文本的网络协议,如 SMTP 和 HTTP 等))。FILE *
使您能够使用fscanf
和其他 stdio 功能。open
功能的其他平台。在我看来,行结尾的翻译更多地阻碍了你而不是帮助你,而且
fscanf
的解析是如此的弱,以至于你不可避免地最终将它扔掉以支持更有用的东西。大多数支持 C 的平台都有
open
功能。这就留下了缓冲问题。在您主要按顺序读取或写入文件的地方,缓冲支持确实很有帮助,并且大大提高了速度。但这可能会导致一些有趣的问题,即数据不会在您期望它存在时出现在文件中。您必须记住在适当的时间使用
fclose
或fflush
。如果您正在寻找(又名
fsetpos
或fseek
第二个以符合标准的方式使用会稍微复杂一些),缓冲的有用性很快就会下降。当然,我的偏见是我经常使用套接字,而且事实上你真的想做非阻塞 IO(这
FILE *
完全无法以任何合理的方式支持)根本没有缓冲,而且经常有复杂的解析要求,这真的影响了我的看法。