除了语法上的原因之外,还有其他你想要使用的原因吗

FILE *fdopen(int fd, const char *mode);

or

FILE *fopen(const char *path, const char *mode);

而不是

int open(const char *pathname, int flags, mode_t mode);

在Linux环境下使用C语言?


当前回答

如果你有一个FILE *,你可以使用fscanf, fprintf和fgets等函数。如果你只有文件描述符,你有有限的(但可能更快)输入和输出例程读,写等。

其他回答

使用开、读、写意味着你必须担心信号交互。

如果调用被信号处理程序中断,函数将返回-1 并将errno设置为EINTR。

关闭文件的正确方法是

while (retval = close(fd), retval == -1 && ernno == EINTR) ;

对于我的应用程序,我从fopen()更改为open(),因为每次我运行fopen fgetc时,fopen都会导致双重读取。重复阅读破坏了我想要完成的事情。Open()似乎只做您要求它做的事情。

Open()将在每个fopen()家族函数的末尾调用。Open()是一个系统调用,fopen()是库提供的包装函数,方便用户使用

除非你属于那0.1%的应用程序,使用open可以带来实际的性能优势,否则真的没有理由不使用fopen。就fdopen而言,如果不使用文件描述符,就不需要这个调用。

坚持使用fopen及其方法家族(fwrite、fread、fprintf等),您将会非常满意。同样重要的是,其他程序员也会对你的代码感到满意。

还取决于需要打开哪些标志。关于写和读(以及可移植性)的用法,应该使用f*,如上所述。

但是如果想要指定更多的标准标志(如rw和append标志),则必须使用特定于平台的API(如POSIX open)或抽象这些细节的库。c标准没有任何这样的标志。

例如,您可能希望仅在文件退出时才打开该文件。如果不指定create标志,则该文件必须存在。如果将exclusive添加到create,则只会在文件不存在时创建该文件。还有更多。

例如,在Linux系统上,有一个通过sysfs公开的LED接口。它通过一个文件暴露led的亮度。以0-255的字符串形式写入或读取数字。当然,您不希望创建该文件并只在它存在时才写入它。现在最酷的事情是:使用fdopen来使用标准调用读取/写入这个文件。