C fopen vs open

标签 c linux file-io fopen

你有什么理由(除了句法的)你想使用

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 时?

最佳答案

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

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

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

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

而且大多数支持 C 的平台都有一个 open 函数。

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

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

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

关于C fopen vs open,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1658476/

相关文章:

C 中无法在另一个函数中打印函数的返回值

c - 从多个线程读取数组时要注意什么?

c - 如何在 Windows C 代码中检测 gdb?

linux - 缺少参数的打印错误

c# - 当事件发生时将数据写入 xml 时出现问题

c - 从文件中读取并将格式化的行输入到链接列表中。 C

c++ - 使用 C API 在 aspell 中创建自定义词典

linux - 在 Linux 中通过编辑二进制文件来更改函数

windows - Windows 开发人员切换到 Linux 的资源

android - SD卡上的文件IO性能