C打开vs打开

是否有任何理由(除了语法的)你想要使用

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时?

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

  1. fopen为你提供缓冲IO,可能会比你打开时要快很多。
  2. 如果文件没有以二进制模式打开, fopen执行行结束转换,如果您的程序被移植到非Unix环境中,这可能会非常有帮助。
  3. FILE *使您可以使用fscanf和其他stdiofunction。
  4. 您的代码可能有一天需要移植到其他仅支持ANSI C的平台,并且不支持openfunction。

在我看来,结束语的翻译更多的时候会阻碍你,而fscanf的parsing是如此的微弱,以至于你不可避免地会抛弃它,转而使用更有用的东西。

而且大多数支持C的平台都有一个openfunction。

这留下了缓冲的问题。 在你主要依次读写文件的地方,缓冲支持真的很有帮助,而且速度有了很大的提高。 但是,它可能会导致一些有趣的问题,其中数据不会在文件中出现,当您期望它在那里时。 你必须记得在适当的时候fflush

如果你正在寻求,缓冲的有用性很快就会下降。

当然,我的偏见是我倾向于使用套接字很多,而且事实上你真的想做非阻塞的IO( FILE *完全不能以任何合理的方式支持),而且根本没有缓冲而且经常有复杂的分析需求,这真的让我的看法变得更为明显

open()是一个低级的os调用。 fdopen()将os级文件描述符转换为C语言的高级FILE抽象。 fopen()在后台调用open()并直接给你一个FILE指针。

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

打开vs C打开

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

2) fopen提供缓冲的IO非缓冲的 open更快。

3) fopen便携式的,open便携式开放是特定的环境 )。

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

5) FILE *使您能够使用fscanf和其他stdiofunction。

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

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

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

使用打开,读取,写入意味着您不得不担心信号交互。

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

所以closures文件的正确方法是

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

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

在Unix中:
您可以使用以下命令从filedescriptor获取文件指针:
fP = fdopen(fD, "a");
您可以使用以下命令从文件指针获取文件描述符:
fD = fileno (fP);

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

我改变了打开()从fopen()为我的应用程序,因为fopen导致双重读取每次我运行fopen fgetc。 双读是破坏我想要完成的。 开放()似乎只是做你所要求的。

还取决于需要打开哪些标志。 关于使用的写作和阅读(和便携性)f *应该使用,如上所述。

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

例如,你可能想打开一个文件,只有当它退出。 如果您不指定创build标志,则该文件必须存在。 如果添加专有的创build,它将只创build文件,如果它不存在。 还有更多。

例如,在Linux系统中,通过sysfs公开了一个LED接口。 它通过一个文件暴露出led的亮度。 书写或读取一个string,范围从0-255。 当然你不想创build这个文件,只有在存在的时候才写入。 现在很酷的事情:使用fdopen来读/写这个文件,使用标准调用。

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更快更合适。