您是否有想要使用的任何原因(除了语法原因之外)
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时?
首先,没有特别好的理由去使用fdopenif fopen是一个选项,open而另一个是可能的选择。如果您要使用open,则不应该首先使用该文件FILE *。因此,将其包括fdopen在该列表中是不正确且令人困惑的,因为它与其他列表不太相似。现在,我将继续忽略它,因为此处的重要区别在于C标准FILE *和OS特定的文件描述符之间。
fdopen
fopen
open
FILE *
使用fopen而不是的主要原因有四个open。
fscanf
在我看来,以行结尾的翻译不但不会帮助您,反而会给您fscanf带来更多麻烦,而且对它的解析是如此微弱,以至于您不可避免地最终将其抛弃,而转向了更有用的东西。
并且大多数支持C的平台都具有open功能。
这留下了缓冲问题。在主要按顺序读取或写入文件的地方,缓冲支持确实很有帮助,并且可以大大提高速度。但是,这可能会导致一些有趣的问题,即当您希望数据存在于文件中时,数据不会最终出现在文件中。您必须记住fclose或fflush在适当的时候。
fclose
fflush
如果您正在执行搜索(又名fsetpos或fseek第二种,以符合标准的方式使用起来比较棘手),则缓冲的有用性会迅速下降。
fsetpos
fseek
当然,我的偏见是我倾向于大量使用套接字,并且事实是您真的想做无阻塞的IO(它FILE *完全无法以任何合理的方式支持)并且根本没有缓冲。复杂的解析要求确实使我的看法蒙上了一层阴影。