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是有四个主要的原因。
-
fopen
为你提供缓冲IO,可能会比你打开时要快很多。 - 如果文件没有以二进制模式打开,
fopen
执行行结束转换,如果您的程序被移植到非Unix环境中,这可能会非常有帮助。 -
FILE *
使您可以使用fscanf
和其他stdiofunction。 - 您的代码可能有一天需要移植到其他仅支持ANSI C的平台,并且不支持
open
function。
在我看来,结束语的翻译更多的时候会阻碍你,而fscanf的parsing是如此的微弱,以至于你不可避免地会抛弃它,转而使用更有用的东西。
而且大多数支持C的平台都有一个open
function。
这留下了缓冲的问题。 在你主要依次读写文件的地方,缓冲支持真的很有帮助,而且速度有了很大的提高。 但是,它可能会导致一些有趣的问题,其中数据不会在文件中出现,当您期望它在那里时。 你必须记得在适当的时候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 *
,你可以使用像fscanf
, fprintf
和fgets
等函数。如果你只有文件描述符,你有限制(但可能更快)的input和输出例程read
, write
等。
除非你是使用open
的0.1%应用程序的一部分是一个实际的性能优势,否则没有理由不使用fopen
。 至于fdopen
而言,如果你没有使用文件描述符,你不需要这个调用。
坚持fopen
及其家族的方法( fwrite
, fread
, fprintf
等),你会很满意。 同样重要的是,其他程序员将会对你的代码感到满意。
使用打开,读取,写入意味着您不得不担心信号交互。
如果调用被信号处理程序中断,函数将返回-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更快更合适。