C fopen vs open

新手上路,请多包涵

是否有任何理由(除了句法的)你想使用

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 许可协议

阅读 769
2 个回答

首先,没有特别好的理由使用 fdopen 如果 fopen 是一个选项,而 open 是另一个可能的选择。如果你想要一个 FILE * ,你不应该首先使用 open 打开文件。因此,在该列表中包含 fdopen 是不正确且令人困惑的,因为它与其他列表不太相似。我现在将继续忽略它,因为这里的重要区别在于 C 标准 FILE * 和特定于操作系统的文件描述符之间。

使用 fopen 而不是 open 有四个主要原因。

  1. fopen 为您提供缓冲 IO,结果可能比您正在使用的 open
  2. fopen 如果文件未以二进制模式打开,则进行行尾转换,如果您的程序曾经被移植到非 Unix 环境,这将非常有帮助(尽管世界似乎正在趋向于仅 LF (除了 IETF 基于文本的网络协议,如 SMTP 和 HTTP 等))。
  3. FILE * 使您能够使用 fscanf 和其他 stdio 功能。
  4. 您的代码可能有一天需要移植到仅支持 ANSI C 而不支持 open 功能的其他平台。

在我看来,行结尾的翻译更多地阻碍了你而不是帮助你,而且 fscanf 的解析是如此的弱,以至于你不可避免地最终将它扔掉以支持更有用的东西。

大多数支持 C 的平台都有 open 功能。

这就留下了缓冲问题。在您主要按顺序读取或写入文件的地方,缓冲支持确实很有帮助,并且大大提高了速度。但这可能会导致一些有趣的问题,即数据不会在您期望它存在时出现在文件中。您必须记住在适当的时间使用 fclosefflush

如果您正在寻找(又名 fsetposfseek 第二个以符合标准的方式使用会稍微复杂一些),缓冲的有用性很快就会下降。

当然,我的偏见是我经常使用套接字,而且事实上你真的想做非阻塞 IO(这 FILE * 完全无法以任何合理的方式支持)根本没有缓冲,而且经常有复杂的解析要求,这真的影响了我的看法。

原文由 Omnifarious 发布,翻译遵循 CC BY-SA 4.0 许可协议

open() 是低级操作系统调用。 fdopen() 将操作系统级别的文件描述符转换为 C 语言的高级文件抽象。 fopen() open() 并直接给你一个文件指针。

使用 FILE 对象而不是原始文件描述符有几个优点,其中包括更易于使用,还有其他技术优势,例如内置缓冲。特别是缓冲通常会带来相当大的性能优势。

原文由 Emil H 发布,翻译遵循 CC BY-SA 2.5 许可协议

推荐问题