首先,没有特别好的理由来使用fdopen
if fopen
是一个选项,open
而另一个是可能的选择。如果您要使用open
,则不应该首先使用该文件FILE *
。因此,将其包括fdopen
在该列表中是不正确且令人困惑的,因为它与其他列表不太相似。我现在将继续忽略它,因为这里的重要区别是C标准FILE *
和OS特定的文件描述符之间。
使用fopen
而不是的四个主要原因open
。
fopen
为您提供的缓冲IO可能比您执行的速度要快得多open
。
fopen
如果未以二进制模式打开文件,则执行行末尾翻译,如果您的程序曾经移植到非Unix环境(尽管世界似乎仅在LF上融合(基于IETF文本的网络除外),这将非常有帮助SMTP和HTTP等协议))。
- A
FILE *
使您能够使用fscanf
和其他stdio功能。
- 您的代码可能有一天需要移植到仅支持ANSI C而不支持该
open
功能的其他平台。
在我看来,以行结尾的翻译不但不能帮助您,而且常常会给您带来fscanf
麻烦,而且对它的解析非常弱,以至于您不可避免地要把它扔掉,而转而使用更有用的东西。
并且大多数支持C的平台都具有open
功能。
这留下了缓冲问题。在主要按顺序读取或写入文件的地方,缓冲支持确实很有帮助,并且可以大大提高速度。但是,这可能会导致一些有趣的问题,即当您希望数据存在于文件中时,数据不会最终出现在文件中。您必须记住fclose
或fflush
在适当的时候。
如果您正在执行搜索(又名fsetpos
或fseek
第二种,以符合标准的方式使用起来比较棘手),则缓冲的作用会迅速下降。
当然,我的偏见是我倾向于大量使用套接字,并且事实是您真的想做无阻塞的IO(这FILE *
完全无法以任何合理的方式支持),并且根本没有缓冲。复杂的解析要求确实使我的看法蒙上了一层阴影。
fdopen
和open
或fopen
与open
?