open函数簇与fopen函数簇区别和用法

文章目录

  • 1 前言
  • 2 open与fopen区别
    • 2.1 标准不同
    • 2.2 层次不同
    • 2.3 适用对象不同(返回值不同)
    • 2.4 缓冲区
    • 2.5 效率不同
  • 3 使用方法
    • 3.1 open
    • 3.2 fopen


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_RDONLY0x0001只读方式打开
O_WRONLY0x0002只写方式打开
O_RDWR0x0004读写方式打开
O_CREAT0x0100如果文件不存在,则创建
O_TRUNC0x0200打开文件并将文件长度设置为0
O_EXCL0x0400如果要创建的文件已存在,则返回-1,并修改errno的值
O_APPEND0x0800追加方式打开
O_TEXT0x4000打开文本文件
O_BINARY0x8000打开二进制文件
  • mode,创建文件时指定属性,在access参数存在O_CREAT有效
涵义
S_IFMT0xF000文件类型掩码
S_IFDIR0x4000目录文件
S_IFIFO0x1000管道(FIFO)文件
S_IFCHR0x2000字符设备文件
S_IFBLK0x3000块设备文件
S_IREAD0x0100文件可读
S_IWRITE0x0080文件可写
S_IEXEC0x0040文件可执行
  • 返回值,成功返回文件描述符(句柄);失败返回-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+可读写、追加方式打开二进制文件
  • 返回值,成功返回文件结构指针;失败返回NULL


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部