当前位置: 首页 > news >正文

fopen和open 等区别是什么?文件描述符与文件描述指针区别

FILE *fp = fopen(path, "w");
int fd =open(path,)

1.区别

函数定义所属库返回类型
fopen高级文件操作函数,提供缓冲机制标准 C 库 (stdio.h)FILE*(文件指针)
open低级文件操作函数,直接调用系统接口Unix/Linux 系统调用 (fcntl.h)int(文件描述符)
(1) 抽象层级
  • fopen

    • 属于 高级 I/O 操作,封装了底层系统调用(如 openreadwrite)。

    • 提供 缓冲机制(缓冲区的数据可能不会立即写入磁盘,除非显式调用 fflush 或 fclose)。

    • 支持格式化输入输出(如 fprintffscanf)。

  • open

    • 属于 低级 I/O 操作,直接与操作系统交互。

    • 无缓冲机制:每次 read/write 都会触发系统调用,数据直接操作硬件。

    • 提供更精细的控制(如文件权限、打开模式标志)。

(2) 打开模式
  • fopen
    使用字符串指定模式(如 "r""w""a""rb" 等):

    FILE *fp = fopen("file.txt", "w"); // 写入模式(覆盖)
  • open
    使用位掩码标志指定模式(如 O_RDONLYO_WRONLYO_CREATO_APPEND 等):

    int fd = open("file.txt", O_WRONLY | O_CREAT, 0644); // 写入+创建,权限 0644
    (3) 错误处理
  • fopen

    • 返回 NULL 表示失败,需通过 errno 或 perror 获取错误原因:

      
      FILE *fp = fopen("file.txt", "r");
      if (!fp) {
          perror("fopen失败");
          exit(EXIT_FAILURE);
      }
  • open

    • 返回 -1 表示失败,错误码存储在 errno 中:

      int fd = open("file.txt", O_RDONLY);
      if (fd == -1) {
          perror("open失败");
          exit(EXIT_FAILURE);
      }

      2. 联系与协作

      (1) 从 FILE* 获取文件描述符

      可以通过 fileno() 函数从 FILE* 获取底层文件描述符:

      FILE *fp = fopen("file.txt", "w");
      int fd = fileno(fp); // 获取关联的文件描述符
    •  当fopen成功时,C标准库会:

      1. 调用底层系统调用(如open())打开文件,获取文件描述符(例如返回3)。

      2. 将文件描述符、缓冲区等信息封装到FILE结构体中。

      3. 返回指向该结构的指针(FILE* fp)。

    • (2) 混合使用场景
    • 使用 open 打开文件后,可通过 fdopen() 将其转换为 FILE*

      int fd = open("file.txt", O_WRONLY);
      FILE *fp = fdopen(fd, "w"); // 将文件描述符转为FILE*

    3. 典型使用场景

    适合 fopen 的场景
    1. 文本文件读写(如配置文件、日志文件)。

    2. 需要格式化输入输出(如 fprintf 写入结构化数据)。

    3. 跨平台开发(标准 C 库接口通用)。

    适合 open 的场景
    1. 需要精细控制文件权限(如设置 O_CREAT 时指定权限掩码)。

    2. 使用非阻塞 I/O(如 O_NONBLOCK)。

    3. 操作特殊文件(如设备文件 /dev 下的节点)。

    4. 实现文件锁(fcntl 系统调用需文件描述符)。

            文件指针(FILE指针)与文件描述符的区别**:

    文件指针:由C标准库提供,类型为`FILE*`,用于高级文件操作(如`fprintf`, `fscanf`等)。

    文件描述符:由操作系统提供,类型为整数(如`int`),用于底层系统调用(如`read`, `write`)。

    可以使用`fileno()`函数获取文件描述符,例如:`int fd = fileno(fp);`,其中`fp`是`FILE*`类型。

    在Linux系统中,可以通过/proc/<pid>/fd查看进程打开的文件描述符。例如:

    # 假设程序PID为1234
    ls -l /proc/1234/fd

     

    4. 总结

    特性fopenopen
    抽象层级高级(带缓冲)低级(无缓冲)
    性能适合批量操作适合实时操作
    灵活性有限(依赖标准库)高(直接控制文件描述符)
    跨平台性强(标准C库)弱(依赖Unix/Linux系统)
    典型用途文本处理、格式化I/O设备操作、非阻塞I/O、文件锁

    相关文章:

  • 如何防御大模型中的 Prompt 攻击?
  • 跨境电商独立站B端站与C端站有什么不同
  • stress-ng命令详解
  • 在线文档导出为word/pdf/png
  • 瑞萨RX23E系列开发(二)建立工程
  • 【VUE】day06 动态组件 插槽 自定义指令 ESlint
  • 用 pytorch 从零开始创建大语言模型(五):预训练无标注数据
  • 【网络层协议】NAT技术内网穿透
  • 复变函数摘记2
  • 蓝桥备赛指南(8):01背包模型
  • WPS宏开发手册——JSA语法
  • 在Linux、Windows系统上安装开源InfluxDB——InfluxDB OSS v2并设置开机自启的保姆级图文教程
  • TCP协议原理
  • CentOS7 离线下载安装 GitLab CE
  • ubuntu设置开机自动运行应用
  • UE5摄像机震屏/晃动效果
  • 银河麒麟桌面版包管理器(四)
  • Xshell、Xsftp、Xmanager中文版安装包及使用教程
  • Uniapp:基于 Vue.js 的高效跨平台开发框架
  • 前端监控相关
  • 罗马教皇利奥十四世正式任职
  • “80后”北大硕士罗婕履新甘肃宁县县委常委、组织部部长
  • 种植耐旱作物、启动备用水源,甘肃各地多举措应对旱情
  • 光明日报社副总编辑薄洁萍调任求是杂志社副总编辑
  • 北京韩美林艺术馆党支部书记郭莹病逝,终年40岁
  • 混乱的5天:俄乌和谈如何从充满希望走向“卡壳”