Linux–open与fopen的区别
open()
#include <stdio.h>
int open(const char *path, int access,int mode)
path 要打开的文件路径和名称
access 访问模式,宏定义和含义如下:
O_RDONLY 1 只读打开
O_WRONLY 2 只写打开
O_RDWR 4 读写打开
还可选择以下模式与以上3种基本模式相与:
O_CREAT 0x0100 创建一个文件并打开
O_TRUNC 0x0200 打开一个已存在的文件并将文件长度设置为0,其他属性保持
O_EXCL 0x0400 未使用
O_APPEND 0x0800 追加打开文件
O_TEXT 0x4000 打开文本文件翻译CR-LF控制字符
O_BINARY 0x8000 打开二进制字符,不作CR-LF翻译
mode 该参数仅在access=O_CREAT方式下使用,其取值如下:
S_IFMT 0xF000 文件类型掩码
S_IFDIR 0x4000 目录
S_IFIFO 0x1000 FIFO 专用
S_IFCHR 0x2000 字符专用
S_IFBLK 0x3000 块专用
S_IFREG 0x8000 只为0x0000
S_IREAD 0x0100 可读
S_IWRITE 0x0080 可写
S_IEXEC 0x0040 可执行
举例:
int fd = open(KEY_EVENT_FILE, O_RDONLY);
if (fd < 0) {
printf("open RECOVERY_KEY event failed.\n");
return NULL;
}
fopen
FILE *fopen(char *filename, char *mode)
filename 文件名称
mode 打开模式:
r 只读方式打开一个文本文件
rb 只读方式打开一个二进制文件
w 只写方式打开一个文本文件
wb 只写方式打开一个二进制文件
a 追加方式打开一个文本文件
ab 追加方式打开一个二进制文件
r+ 可读可写方式打开一个文本文件
rb+ 可读可写方式打开一个二进制文件
w+ 可读可写方式创建一个文本文件
wb+ 可读可写方式生成一个二进制文件
a+ 可读可写追加方式打开一个文本文件
ab+ 可读可写方式追加一个二进制文件
举例
/*step1: open station save log file */
FILE *fp = fopen(STATION_LOG_FILE, "r");
if (!fp) {
LOGMSG("open file failed\r\n");
return false;
}
open和fopen的区别:
来源
open是UNIX系统调用函数(包括LINUX等),返回的是文件描述符(File Descriptor),它是文件在文件描述符表里的索引。
fopen是ANSI C标准中的C语言库函数,在不同的系统中应该调用不同的内核api。返回的是一个指向文件结构的指针。
适用范围
open返回文件描述符,而文件描述符是UNIX系统下的一个重要概念,UNIX下的一切设备都是以文件的形式操作。如网络套接字、硬件设备等。当然包括操作普通正规文件(Regular File)。- fopen是用来操纵普通正规文件(Regular File)的。
文件IO层次
如果从文件IO的角度来看,前者属于低级IO函数,后者属于高级IO函数。低级和高级的简单区分标准是:谁离系统内核更近。低级文件IO运行在内核态,高级文件IO运行在用户态。
总结
- open属于低级IO,fopen是高级IO。
- 前者返回一个文件描述符(用户程序区的),后者返回一个文件指针。
- 一般用fopen打开普通文件,用open打开设备文件
- 为了使程序获得更好的可移植性,未到非得使用一些fopen系列无法实现的功能的情况下,fopen系列是首选。
本文详细介绍了Linux系统中open()和C语言库函数fopen()的区别。open()是系统调用,返回文件描述符,适用于所有类型的设备,包括普通文件和设备文件;而fopen()是高级IO函数,返回文件指针,主要用于普通文件操作。open提供了更多的文件操作选项,如O_CREAT、O_APPEND等,fopen则提供更简洁的打开模式如'r'、'w'等。两者在文件IO层次上,open属于低级IO,fopen属于高级IO,一般推荐使用fopen进行普通文件操作以提高可移植性。
733

被折叠的 条评论
为什么被折叠?



