C fopen vs open

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

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语言?

224352 次浏览

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

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

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

除非你是0.1%的应用程序中的一部分,使用open是一个实际的性能优势,否则真的没有好的理由不使用fopen。就fdopen而言,如果你不使用文件描述符,你就不需要这个调用。

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

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

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

  1. fopen为你提供了缓冲IO,它可能比你用open所做的要快得多。
  2. 如果文件不是以二进制模式打开,fopen会进行行结束转换,如果你的程序被移植到非unix环境,这将非常有帮助(尽管世界似乎只在lf上收敛(除了IETF基于文本的网络协议,如SMTP和HTTP等)。
  3. FILE *使你能够使用fscanf和其他stdio函数。
  4. 你的代码可能有一天需要移植到其他只支持ANSI C而不支持open函数的平台上。

在我看来,行尾翻译经常会妨碍你,而不是帮助你,而且fscanf的解析是如此的弱,以至于你不可避免地会把它扔掉,以支持更有用的东西。

大多数支持C语言的平台都有open函数。

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

如果你正在进行查找(又名fsetposfseek,其中第二个在标准兼容的方式下使用起来稍微有点棘手),缓冲的有用性很快就会下降。

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

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

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

关闭文件的正确方法是

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

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

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

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.
这是打开外部文件函数
的行为方式 在缓冲过程中有一些原因,可能会超时。因此,当比较打开外部文件(高级i/o)和开放(低级i/o)系统调用时,它比打开外部文件更快更合适
open()是一个系统调用,特定于基于unix的系统,它返回一个文件描述符。你可以使用另一个系统调用write()写入文件描述符 fopen()是一个ANSI C函数调用,返回一个文件指针,它可以移植到其他操作系统。可以使用fprintf写入文件指针。< / p > 在Unix中< p >: < br > 你可以使用

从文件描述符中获取文件指针
fP = fdopen(fD, "a");

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

fD = fileno (fP);

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

fopen和C语言中的open

1) fopen库函数,而open系统调用

2) fopen提供了输入输出缓冲,它比非缓冲open更快。

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

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

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

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

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

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

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