你有什么理由(除了句法的)你想使用
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
有四个主要原因。
fopen
为您提供缓冲 IO,结果可能比您使用open
所做的要快得多。
如果文件没有以二进制模式打开,fopen
会进行行尾转换,如果您的程序曾经移植到非 Unix 环境(尽管世界似乎正在趋同),这将非常有用仅在 LF 上(除了 IETF 基于文本的网络协议(protocol),如 SMTP 和 HTTP 等)。FILE *
让您能够使用fscanf
和其他 stdio 函数。- 您的代码可能有一天需要移植到仅支持 ANSI C 而不支持
open
功能的其他平台。
在我看来,行结尾的翻译往往会阻碍你而不是帮助你,并且 fscanf
的解析非常弱,以至于你不可避免地最终将它扔掉以支持更有用的东西。
而且大多数支持 C 的平台都有一个 open
函数。
这就留下了缓冲问题。在您主要按顺序读取或写入文件的地方,缓冲支持确实很有帮助,并且大大提高了速度。但这可能会导致一些有趣的问题,即数据不会在您期望它存在时出现在文件中。您必须记住在适当的时间 fclose
或 fflush
。
如果您正在寻找(又名 fsetpos
或 fseek
以符合标准的方式使用其中的第二个稍微复杂一些),缓冲的用处很快就会消失下来。
当然,我的偏见是我经常使用套接字,而且事实上你真的想做非阻塞 IO(FILE *
完全不支持以任何合理的方式)根本没有缓冲,并且经常有复杂的解析要求,这确实影响了我的看法。
关于C fopen vs open,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1658476/