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

2023-05-16

文章目录

  • 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

open函数簇与fopen函数簇区别和用法 的相关文章

随机推荐

  • FileZilla以root用户登录Linux

    一 首先创建root用户的密码 span class hljs built in sudo span passwd root 然后输入要设置的密码 xff0c 然后再输入一次 xff0c 成功 xff01 二 修改配置文件 filezila
  • px4编译

    如果下载速度特别慢 xff0c 可以使用手机的4G网络 位置确定 mkdir p src cd src 开始下载指定版本的px4 xff0c 在这里是v1 8 2版本 git clone b v1 8 2 https github com
  • px4源码----位置估算(position_estimator_inav_params.h)

    pragma once include lt parameters param h gt struct position estimator inav params float w z baro 权重 z轴 气压计位置 0 5 float
  • ubuntu如何把调整cpu策略

    一 安装cpu频率管理软件 sudo apt get install cpufrequtils 二 查看cpu当前状态 cpufreq info 其中available cpufreq governors xff1a performance
  • 树莓派系统介绍

    树莓派是一个微型计算机 xff0c 和普通的电脑没有什么区别 xff0c 只是体积更小 xff0c 只有卡片大小 xff0c 存储能力和计算能力会差一点 xff0c 主要用于学习 xff0c 实验所用 是电脑就要安装操作系统 xff0c 树
  • 小觅摄像头ROS编译错误

    GitHub slightech MYNT EYE ORB SLAM2 Sample Forked from ORB SLAM2 https github com raulmur ORB SLAM2 Forked from ORB SLAM
  • 华为路由器交换机常用命令(随时补充更新)

    一 视图切换 lt huawei gt 用户视图 huawei 系统视图 xff0c 在用户视图状态下输入sys进入 xff0c 在系统视图下输入quit或者return返回用户视图 huawei g0 0 1 端口视图 xff0c 从系统
  • 01路径规划问题的相关理论

    目录 1 旅行商问题 2 有能力约束的车辆路径问题 3 车辆路径主要要素特征 4 约束条件分析 5 带时间窗的车辆路径问题 6 车辆路径问题求解算法 7 小节 1 旅行商问题 旅行商问题 xff08 Traveling Saleman Pr
  • 时序数据库-3-[IoTDB]的安装与使用

    IoTDB官方文档手册 Apache IoTDB xff08 物联网数据库 xff09 是一体化收集 存储 管理与分析物联网时序数据的软件系统 Apache IoTDB 采用轻量式架构 xff0c 具有高性能和丰富的功能 xff0c 并与A
  • 【强烈推荐】基于STM32的TFT-LCD各种显示实现(内容详尽含代码)

    前言 xff1a TFT LCD模块作为人们日常生活中常见屏幕类型之一 xff0c 使用的受众面非常广阔 例如 xff1a 显示各个传感器数值 xff0c 显示精美界面 xff0c 多级化菜单系统等等都不离不开他的身影 可以说学会TFT L
  • 时序数据库-4-[IoTDB]的python3操作

    从采集到存储 xff1a 时序数据库到底怎么处理时间 xff1f iotdb官方文档手册 1 容器安装iotdb 可以使用docker volume create命令创建 docker 卷 此命令将在 var lib docker volu
  • [汇总]基于ESP32的四旋翼无人机开发纪实

    文章目录 一 项目说明1 已实现功能2 硬件配置 二 ESPlane2 0 开发笔记三 相关传感器驱动移植四 参考链接 ESPlane 项目更名为 ESP Drone 现已公开代码仓库和文档 代码仓库 xff1a https github
  • [填坑]Ubuntu安装显卡专有驱动后鼠标键盘无法使用

    问题描述 我在两个地方遇到了同样的问题 xff0c 解决方法也如出一辙 xff0c 由于没有研究源码 xff0c 暂不清楚原因 问题1描述 xff1a 为了解决Ubuntu下笔记本功耗问题 xff0c 在网友建议下我安装了bumblebee
  • uniapp-前后端开发app-系列01开篇

    系列文章目录 文章目录 系列文章目录前言一 开发工具 xff1f 二 项目架构三 具体内容实现 前言 提示 xff1a 这里可以添加本文要记录的大概内容 xff1a 随着app和小程序的发展 有没有开发一个模版 其他端程序都能用 uniap
  • TypeError: iter() returned non-iterator of type

    在使用Python迭代器时出现错误 xff1a class Fibs def init self self a 61 0 self b 61 1 def next self self a self b 61 self b self a 43
  • 【Linux应用编程】一个异步信号处理引起死锁问题的思考

    文章目录 1 前言2 为什么会产生死锁2 1 死锁2 2 分析2 3 结论 3 避免死锁4 举一反三5 死锁例子代码6 参考文章 1 前言 最近在维护别人的代码时 xff0c 遇到一个线程死锁问题 xff0c 一番折腾 xff0c 最终定位
  • 【RT-Thread】SGM706独立看门狗软件包

    文章目录 1 简介1 1 目录结构1 2 许可证 2 芯片介绍3 支持情况4 使用说明4 1 依赖4 2 获取软件包4 3 初始化4 4 启动看门狗4 5 msh finsh测试查看设备注册通过msh启动看门狗 5 注意事项6 联系方式 1
  • 利用tldr工具再也不怕记不住Linux命令

    文章目录 1 前言2 tldr3 安装4 使用 1 前言 linux命令非常多 xff0c 少用的命令往往易忘记 xff0c 甚至常用的语法较为复杂的命令也不好记住 当然有些太复杂的命令也不需要死记硬背 xff0c 我们往往会借助man命令
  • C++中的二阶构造函数

    文章目录 1 前言2 二阶构造3 总结 1 前言 构造函数用于创建对象时对象成员的初始化 xff0c 如赋初值 申请内存 加载文件等 xff0c 即是自动完成对象的初始化任务 在C 43 43 语言中 xff0c 构造函数执行顺序是 xff
  • open函数簇与fopen函数簇区别和用法

    文章目录 1 前言2 open与fopen区别2 1 标准不同2 2 层次不同2 3 适用对象不同 xff08 返回值不同 xff09 2 4 缓冲区2 5 效率不同 3 使用方法3 1 open3 2 fopen 1 前言 linux系统