题
没有任何理由(比其他法人)你想要使用
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);
当使用C在Linux的环境?
解决方案
第一,没有特别的好理由使用 fdopen
如果 fopen
是一个选项, open
是的其他可能的选择。你不应该有用 open
打开文件中的第一个地方如果你想要一个 FILE *
.所以包括 fdopen
在该列表中的不正确和令人困惑,因为它不是非常喜欢其他人。我现在将继续忽视它,因为重要的区别在这里之间的一C的标准 FILE *
和一个操作系统的具体文件的描述符。
有四个主要原因使用 fopen
而不是的 open
.
fopen
为您提供了缓冲IO,可能会变得快得多比你在做什么用open
.fopen
不行结束翻译如果文件不打开,在二元模式,该模式可以是非常有益的,如果你的计划是曾经移植到一个非Unix环境。- 一个
FILE *
让你有能力使用fscanf
和其他stdio功能。 - 你的代码可以有一天需要移植到其他一些平台,仅支持ANSI C并不支持
open
功能。
在我看来这行结束翻译更经常地在你的方式获得,比可以帮助你,并将分析的 fscanf
是这么弱你不可避免地结束了它扔出有利于更多的东西有用的。
和大多数平台,支持有一个C open
功能。
那叶子的缓冲的问题。在地方,你是主要读或写文件的顺序,缓冲支持,是真正有用的大速度的改善。但它可能导致一些有趣的问题在哪些数据并没有结束在该文件中当你想到它是在那里。你要记住 fclose
或 fflush
在适当的时间。
如果你正在做的要求(又名 fsetpos
或 fseek
第二是稍微更加棘手的使用在一个符合标准的方式),用处的缓冲迅速下降。
当然,我的偏见是,我倾向于工作插一个整体很多,并存在事实上,你真的要做的非blocking IO(其中 FILE *
完全无法支持任何合理的方式)有没有缓冲,在所有的和往往具有复杂的分析的要求真正的颜色我的看法。
其他提示
<强>的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) ;
打开()强>将在每个的 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 <更合适/强>