文章目录
- 1 前言
- 2 open与fopen区别
- 2.1 标准不同
- 2.2 层次不同
- 2.3 适用对象不同(返回值不同)
- 2.4 缓冲区
- 2.5 效率不同
- 3 使用方法
-
1 前言
linux系统下,一切皆文件!除常规文件外,linux把外设、IPC等都以“文件”形式存在,并能使用文件的访问接口(open、read、write)。linux下有7类文件,包括:常规文件、目录文件、字符设备文件、块设备文件、命名管道、套接字、软链接。linux下访问一个文件,可以通过open函数簇或者fopen函数簇访问。
2 open与fopen区别
open、fopen
都可用于打开一个文件,两者在定义、使用方式、使用场景、使用效率等方面存在一定的区别。
与open
同一类簇的函数还有如下函数,它们与open
具有相同或者基本相同的特点和使用特性。
open、close、read、write、getc、getchar、putc、putchar
与
fopen
同一类簇的函数还有如下函数,它们与
fopen
具有相同或者基本相同的特点和使用特性。
fopen、fclose、fread、fwrite、fgetc、fgetchar、fputchar、fputc、fputs、freopen、
fseek、ftell、rewind
2.1 标准不同
- open函数簇是系统函数,不同系统不具备可移植性
- fopen函数簇是ANSI标准C库函数,具备良好的可移植性
2.2 层次不同
- open函数簇属于低级IO
- fopen函数簇属于高级IO
2.3 适用对象不同(返回值不同)
- open函数簇用于设备文件,返回值是一个文件描述符(句柄)
- fopen函数簇用于普通文件,返回值是一个指向文件结构的指针
2.4 缓冲区
- open函数簇无缓存,属于“无缓存文件系统”
- fopen函数簇带有缓存,属于“缓存文件系统”
注:
缓存文件系统:访问文件过程数据都需经过一个“缓存内存区”;对于写过程,数据流方向是:用户 > 缓存 > 磁盘文件;对于读过程,数据流方向是:磁盘文件 > 缓存 > 用户。缓冲文件系统是借助文件结构体指针来对文件进行管理,通过文件指针来对文件进行访问,支持访问字符、二进制类型文件。
非缓存文件系统:非缓存文件系统依赖于操作系统,由操作系统管理文件访问,属于系统级别IO,不支持文件结构体指针,只能访问二进制类型文件。
2.5 效率不同
- 对于随机访问文件,open函数簇比fopen效率高
- 对于顺序访问,fopen函数簇比open效率高
因为,fopen函数簇存在缓存,相比open函数簇直接访问,减少低速IO访问过程频繁在用户态和内核态间切换(open函数簇每次访问文件都需经过用户态和内核态切换),提高访问效率。
3 使用方法
3.1 open
int open(const char *path, int access, int mode);
path
,待访问文件名称(包括路径)access
,访问模式
宏 | 值 | 涵义 |
---|
O_RDONLY | 0x0001 | 只读方式打开 |
O_WRONLY | 0x0002 | 只写方式打开 |
O_RDWR | 0x0004 | 读写方式打开 |
O_CREAT | 0x0100 | 如果文件不存在,则创建 |
O_TRUNC | 0x0200 | 打开文件并将文件长度设置为0 |
O_EXCL | 0x0400 | 如果要创建的文件已存在,则返回-1,并修改errno的值 |
O_APPEND | 0x0800 | 追加方式打开 |
O_TEXT | 0x4000 | 打开文本文件 |
O_BINARY | 0x8000 | 打开二进制文件 |
mode
,创建文件时指定属性,在access
参数存在O_CREAT
有效
宏 | 值 | 涵义 |
---|
S_IFMT | 0xF000 | 文件类型掩码 |
S_IFDIR | 0x4000 | 目录文件 |
S_IFIFO | 0x1000 | 管道(FIFO)文件 |
S_IFCHR | 0x2000 | 字符设备文件 |
S_IFBLK | 0x3000 | 块设备文件 |
S_IREAD | 0x0100 | 文件可读 |
S_IWRITE | 0x0080 | 文件可写 |
S_IEXEC | 0x0040 | 文件可执行 |
- 返回值,成功返回文件描述符(句柄);失败返回-1,错误码存于
error
中,常见错误码如下
EEXIST 参数path所指的文件已存在,却使用了O_CREAT和O_EXCL标志位
EACCESS 参数path所指的文件不符合所要求测试的权限
EROFS 文件只读
EFAULT 参数path指针超出可存取内存空间
EINVAL 参数mode不正确
ENAMETOOLONG 参数path长度超出
ENOTDIR 参数path不是一个有效目录
ENOMEM 核心内存不足
ELOOP 参数path有过多符号连接问题
EIO I/O存取错误
3.2 fopen
FILE *fopen(char *filename, char *mode);
filename
,文件名称mode
,访问模式,字符串类型
字符串 | 涵义 |
---|
r | 只读方式打开文本文件 |
rb | 只读方式打开二进制文件 |
w | 只写方式打开文本文件 |
wb | 只写方式打开二进制文件 |
a | 追加方式打开文本文件 |
ab | 追加方式打开二进制文件 |
r+ | 可读写方式打开文本文件 |
rb+ | 可读写方式打开二进制文件 |
w+ | 可读写方式创建文本文件 |
wb+ | 可读写方式创建二进制文件 |
a+ | 可读写、追加方式打开文本文件 |
ab+ | 可读写、追加方式打开二进制文件 |
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)