是否有任何原因(除了语法之外的其它),您想使用
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时?
是否有任何原因(除了语法之外的其它),您想使用
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时?
首先,有没有什么特别好的理由使用fdopen
如果fopen
是一个选项, open
是另一个可能的选择。 你不应该用open
,如果你想打开摆在首位的文件FILE *
。 因此,包括fdopen
在该列表是不正确和混乱,因为它是不是很喜欢别人。 我现在开始忽略它,因为这里的重要区别是C标准之间FILE *
和特定于操作系统的文件描述符。
有两种使用四个主要原因fopen
,而不是open
。
fopen
为您提供缓冲IO可能最终会比你用什么做快了很多open
。 fopen
做行结束翻译,如果文件没有以二进制模式,如果你的程序是不断移植到非Unix环境,这是非常有帮助的打开。 FILE *
让你使用能力fscanf
和其他stdio函数。 open
功能。 在我看来,行结束翻译往往会挡住你的方式比可以帮助你,和解析fscanf
是如此之弱,你不可避免地最终有利于更有用的东西扔了出来。
而且支持C大多数平台上有一个open
功能。
这使得缓冲问题。 在地方,你主要是读取或写入文件依次,缓冲的支持是真正有用的和一个大的速度提升。 但是,它可能会导致在当你想到它是有数据没有在文件中结束了一些有趣的问题。 你一定要记住fclose
或fflush
在适当的时间。
如果你正在做的目的(又名fsetpos
或fseek
其中第二个是稍微麻烦的符合标准的方式来使用),缓冲的有效性迅速下降。
当然,我的偏见是,我倾向于用插座的工作一大堆,而且事实上,你真正想要做的非阻塞IO(其中FILE *
完全无法以任何合理的方式来支持),没有缓冲可言而且往往有复杂的分析要求真色彩我的看法。
open()
是一个低级别的操作系统调用。 fdopen()
转换操作系统级别文件描述符的C语言的更高级别FILE-抽象。 fopen()
调用open()
背景,并直接给你一个文件指针。
有几个优势,使用文件对象,而原材料的文件描述符,其中包括更易于使用,而且其他的技术优势,如内置的缓冲。 特别是缓冲通常导致相当大的性能优势。
FOPEN VS在C打开
1) fopen
是一个库函数 ,而open
是一个系统调用 。
2) fopen
提供缓冲IO被更快比较open
,其是非缓冲 。
3) fopen
是便携的同时, open
不是便携式的 ( 开放的环境特定的 )。
4) fopen
返回一个指向文件结构(FILE *); open
返回标识文件的整数。
5) FILE *
让你使用的fscanf等标准输入输出功能的能力。
如果你有一个FILE *
,您可以像使用功能fscanf
, fprintf
和fgets
如果您只有文件描述符等等,你有有限的(但可能更快)的输入和输出过程read
, write
等。
除非你的应用程序的0.1%,其中使用部分open
是一个实际的性能优势,实在是没有好的理由不使用fopen
。 至于fdopen
来讲,如果你不与文件描述符玩,你不需要这一呼吁。
坚持使用fopen
及其家庭的方法( fwrite
, fread
, fprintf
,等),你会很满意。 同样重要的是,其他程序员将得到满意你的代码。
使用打开,读,写意味着你不必担心信号interaptions。
如果呼叫是通过信号处理程序中断函数将返回-1并设置errno为EINTR。
因此,要关闭文件的正确方法是
while (retval = close(fd), retval == -1 && ernno == EINTR) ;
open()将在每个fopen()函数家庭功能的结束时调用。 开()是由库提供一个系统调用和fopen()函数作为包装函数为用户容易使用的
open()
是一个系统调用和具体的基于Unix的系统,它返回一个文件描述符。 您可以使用写入文件描述符write()
这是另一种系统调用。
fopen()
是一个ANSI C函数调用返回一个文件指针,并将其移植到其他操作系统。 我们可以通过写一个文件指针fprintf
。
在Unix系统上:
你可以使用文件描述符文件指针:
fP = fdopen(fD, "a");
你可以使用文件指针文件描述符:
fD = fileno (fP);
还取决于需要什么样的标志,以打开。 相对于使用用于写入和读取(和便携性)F *应该使用,如上面所指出。
但是,如果基本上要指定比标准标志的更多(如RW和附加标志),你将不得不使用一个平台特定的API(如POSIX开)或抽象这些细节的库。 C标准来说没有任何这样的标志。
例如,你可能想打开一个文件,只有当它退出。 如果不指定创建标志必须存在的文件。 如果添加的独家创造,它只会创建该文件,如果它不存在。 还有更多。
例如在Linux系统存在通过sysfs中露出的LED接口。 它暴露通过文件LED的亮度。 写入或读取一个数字作为一个字符串从0-255。 当然,你不希望创建一个文件,如果存在只写它。 现在很酷的事情:使用fdopen读/写使用标准调用这个文件。
我换开()从fopen()函数我的应用程序,因为的fopen是造成双读我每次跑的fopen函数fgetc时间。 双读取是破坏性的什么,我试图完成。 开()似乎只是做你问它是什么。
打开使用的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函数的这种行为方式
有而缓冲处理一些原因,可能TIMEDOUT。 因此,尽管比较的fopen(高级I / O)来打开 (低电平I / O)系统调用,并且它是一个速度比的fopen更合适。