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

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等函数。如果你只有文件描述符,你有有限的(但可能更快)输入和输出例程读,写等。


Open()是一个低级操作系统调用。fdopen()将操作系统级别的文件描述符转换为C语言的更高级别的file -抽象。fopen()在后台调用open(),并直接给你一个FILE-pointer。

使用file -object而不是原始文件描述符有几个优点,其中包括更易于使用,以及其他技术优点,如内置缓冲。特别是缓冲通常会带来相当大的性能优势。


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

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


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

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

fopen provides you with buffering IO that may turn out to be a lot faster than what you're doing with open. fopen does line ending translation if the file is not opened in binary mode, which can be very helpful if your program is ever ported to a non-Unix environment (though the world appears to be converging on LF-only (except IETF text-based networking protocols like SMTP and HTTP and such)). A FILE * gives you the ability to use fscanf and other stdio functions. Your code may someday need to be ported to some other platform that only supports ANSI C and does not support the open function.

在我看来,行尾翻译经常会带来麻烦而不是帮助,而且fscanf的解析功能太弱了,最终不可避免地会抛弃它,转而使用更有用的东西。

大多数支持C语言的平台都有一个开放函数。

这就留下了缓冲问题。在主要按顺序读取或写入文件的地方,缓冲支持真的很有帮助,而且大大提高了速度。但这可能会导致一些有趣的问题,即当您期望数据出现在文件中时,数据却没有出现在文件中。你必须记得在适当的时候收水或冲洗水。

如果您正在进行查找(又名fsetpos或fseek,其中第二个要以符合标准的方式使用稍微复杂一些),缓冲的有用性很快就会下降。

当然,我的偏见是,我倾向于大量使用套接字,事实上,你真的想做非阻塞IO (FILE *完全不能以任何合理的方式支持),根本没有缓冲,经常有复杂的解析需求,这真的改变了我的看法。


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

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

关闭文件的正确方法是

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

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


使用fopen打开文件 在我们能够从磁盘上的文件读取(或写入)信息之前,我们必须打开该文件。为了打开文件,我们调用了fopen函数。

1.firstly it searches on the disk the file to be opened.
2.then it loads the file from the disk into a place in memory called buffer.
3.it sets up a character pointer that points to the first character of the buffer.

这就是fopen函数的性质 在缓冲过程中有一些原因,可能会超时。因此,当比较fopen(高级i/o)和open(低级i/o)系统调用时,它比fopen更快更合适。


open()是一个系统调用,特定于基于unix的系统,它返回一个文件描述符。可以使用另一个系统调用write()写入文件描述符。 fopen()是一个ANSI C函数调用,返回一个文件指针,它可以移植到其他操作系统。我们可以使用fprintf写入文件指针。

在Unix中: 你可以使用以下方法从文件描述符中获取文件指针:

fP = fdopen(fD, "a");

你可以使用以下方法从文件指针获取文件描述符:

fD = fileno (fP);

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


fopen和C语言中的open

1) fopen是一个库函数,open是一个系统调用。

2) fopen提供了缓冲IO,它比没有缓冲的open更快。

3) fopen是可移植的,而open是不可移植的(open是特定于环境的)。

4) fopen返回一个指向FILE结构的指针(FILE *);Open返回一个标识文件的整数。

5) FILE *让你能够使用fscanf和其他stdio函数。


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

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

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

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