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

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、文件锁

    相关文章:

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

    FILE *fp fopen(path, "w"); int fd open(path,) 1.区别 函数定义所属库返回类型fopen高级文件操作函数&#xff0c;提供缓冲机制标准 C 库 (stdio.h)FILE*&#xff08;文件指针&#xff09;open低级文件操作函数&#xff0c;直接调用系统接口Unix/Linux 系统调用…...

    什么是张量计算

    以下是对张量计算的详细介绍&#xff0c;结合数学、物理学及计算机科学等多领域视角&#xff1a; 一、张量的基本定义与性质 1. 张量的数学定义 张量是向量空间及其对偶空间的笛卡尔积上的多重线性映射&#xff0c;可视为多维数组或几何对象。其核心特征在于&#xff1a; 坐…...

    【1】Java 零基础入门学习(小白专用)

    【1】Java 零基础入门学习 &#x1f4da;博客主页&#xff1a;代码探秘者 ✨专栏&#xff1a;《JavaSe从入门到精通》 其他更新ing… ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;作者水…...

    [c语言日寄]枚举类型

    【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…...

    替代-UX设计师

    初创公司如何在没有设计师的情况下 打造实用的用户体验 一个常见的捷径是使用预构建的组件库&#xff0c;如谷歌的 Material UI它们为你提供了构建块&#xff0c;但它们并没有为你考虑整个用户流程你仍然需要弄清楚所有这些是如何组合在一起的但是&#xff0c;很多时候&#x…...

    【氧化镓】​​​​掺杂在β-Ga2O3材料中引入的深能级缺陷

    1. 引言 1.1 β-Ga2O3材料的特性与应用前景 β-Ga2O3作为一种新型的宽禁带半导体材料,具有约4.6-4.8 eV的宽带隙、高击穿场强(约8 MV/cm)和优异的热稳定性,适用于高功率和射频电子器件。其独特的物理特性使其在高电压、高频率以及高功率应用场景中具有巨大的潜力。例如,…...

    :ref 和 this.$refs 的区别及 $ 的作用

    :ref 在 Vue 模板中&#xff0c;:ref 这种写法是使用了 Vue 的动态绑定语法&#xff08;: 是 v-bind: 的缩写&#xff09;。ref 是一个特殊的属性&#xff0c;用于给元素或组件注册引用信息。当你使用 :ref 时&#xff0c;通常是在动态地为元素或组件设置引用名称&#xff0c;…...

    分库分表后,跨库查询和分布式事务解决方案

    分库分表主要是为了解决单库单表的性能瓶颈,但拆分后数据分散在不同库和表中,这就导致了跨库查询和分布式事务的问题。 以下是实际项目中应对这些问题的核心策略与技术实现: 一、跨库查询解决方案 1. 全局表(广播表) 适用场景:基础数据表(如地区表、配置表)数据量小且…...

    仅靠prompt,Agent难以自救

    Alexander的观点很明确&#xff1a;未来 AI 智能体的发展方向还得是模型本身&#xff0c;而不是工作流&#xff08;Work Flow&#xff09;。还拿目前很火的 Manus 作为案例&#xff1a;他认为像 Manus 这样基于「预先编排好的提示词与工具路径」构成的工作流智能体&#xff0c;…...

    android初学

    Intent直译意图 显式意图&#xff1a;构造函数&#xff08;实参为两个&#xff09; (当前类对象 this&#xff0c;要跳转的.javaclass文件)&#xff0c; 隐式意图&#xff1a;构造方法实参(填写一个)(需要在清单文件配置)系统自动匹配 点击事件: 注册设置点击监听器的常用三…...

    IDEA修改默认作者名称

    User: IDEA提示注释缺少author信息&#xff0c;但自动设置后&#xff0c;名称不是我想要的默认名称&#xff0c;应该如何修改IDEA里默认的作者名称&#xff1f; Kimi: 以下是几种修改IntelliJ IDEA中默认作者名称的方法&#xff1a; ### 方法一&#xff1a;修改File and Code …...

    Playwright + MCP:用AI对话重新定义浏览器自动化,效率提升300%!

    一、引言&#xff1a;自动化测试的“瓶颈”与MCP的革新 传统自动化测试依赖开发者手动编写脚本&#xff0c;不仅耗时且容易因页面动态变化失效。例如&#xff0c;一个简单的登录流程可能需要开发者手动定位元素、处理等待逻辑&#xff0c;甚至反复调试超时问题。而MCP&#xf…...

    lodash 学习笔记/使用心得

    lodash 学习笔记/使用心得 简单记一下 lodash 的一点学习笔记使用心得&#xff0c;最近也是打算清理一下所有的 dead code&#xff0c;然后发现我们用了好多的 lodash 方法。对比了之前的写法&#xff0c;重新看了一下官方文档&#xff0c;再自己重新动手写了点 util 之后发现…...

    计算机操作系统(五) 前趋图和程序执行与进程的描述(附带图谱表格更好对比理解))

    计算机操作系统&#xff08;五&#xff09; 前趋图和程序执行与进程的描述 前言一、前趋图和程序执行1.1前趋图1.2程序的顺序执行1.3程序的并发执行 二、进程的描述2.1进程的定义与特征2.2进程的基本状态与转换2.3挂起的操作系统和进程的转换2.4进程管理中的数据结构 总结&…...

    “统计视角看世界”专栏阅读引导

    根据文章主题和逻辑关系&#xff0c;我为您设计以下阅读引导方案&#xff1a; #mermaid-svg-xOnE2zTW20jz5myv {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-xOnE2zTW20jz5myv .error-icon{fill:#552222;}#mermaid…...

    C/C++静态库的理解和制作

    1.什么是库 库是写好的现有的&#xff0c;成熟的&#xff0c;可以复用的代码。现实中每个程序都要依赖很多基础的底层库&#xff0c;不可能每个人的代码都从零开始&#xff0c;因此库的存在意义非同寻常。 本质上来说库是⼀种可执行代码的二进制形式&#xff0c;可以被操作系统…...

    【redis】主从复制:单点问题、配置详解、特点详解

    文章目录 单点问题什么是主从复制主从模式能解决的问题并发量有限可用性问题 配置建立复制通过配置文件来指定端口配置主从查看集群结构 断开复制 特点安全性只读传输延迟 单点问题 分布式系统中&#xff0c;涉及到一个非常关键的问题&#xff1a;单点问题 某个服务器程序&…...

    OpenCV HighGUI 模块使用指南(Python 版)

    用户让我编写一个 HighGUI 模块的使用指南&#xff0c;包括函数的使用和应用场景的实现。首先&#xff0c;我需要回顾 HighGUI 模块的主要功能&#xff1a;图像显示、视频捕获、鼠标和键盘事件。然后&#xff0c;按照用户提供的结构&#xff0c;整理每个部分的函数详解、代码示…...

    PyTorch 面试题及参考答案(精选100道)

    PyTorch 的动态计算图与 TensorFlow 的静态计算图有何区别&#xff1f;动态图的优势是什么&#xff1f; PyTorch 的动态计算图和 TensorFlow 的静态计算图在构建方式、灵活性和调试难度等方面存在显著区别。 在构建方式上&#xff0c;TensorFlow 的静态计算图需要先定义好整个…...

    android......

    事件源&#xff0c;就是视图对象&#xff0c;先注册一个监听器&#xff0c;等待用户触发了屏幕&#xff0c;一旦触发会立即产生一个事件源&#xff0c;事件源会生成一个用户点击的触发事件&#xff0c;此刻监听器会立马监听到 &#xff0c;然后监听器调用回调方法 UI理解 全称用…...

    常见中间件漏洞(tomcat)

    CVE-2017-12615 当在Tomcat的conf&#xff08;配置目录下&#xff09;/web.xml配置文件中添加readonly设置为false时&#xff0c;将导致该漏洞产生&#xff0c;&#xff08;需要允许put请求&#xff09; , 攻击者可以利用PUT方法通过精心构造的数据包向存在漏洞的服务器里面上传…...

    计算机网络高频(二)TCP/IP基础

    计算机网络高频(二)TCP/IP基础 1.什么是TCP/IP⭐⭐ TCP/IP是一种网络通信协议,它是互联网中最常用的协议之一。TCP/IP有两个基本的协议:TCP(传输控制协议)和IP(互联网协议)。 TCP(Transmission Control Protocol,传输控制协议)是一种可靠的、面向连接的协议。它负…...

    国际护士节知识竞赛主持稿串词

    在这充满火热激情的季节&#xff0c;我们又迎来了5.12国际护士节。让我们首先向辛勤奋战在护理工作一线的全县广大护士姐妹们道一声: (男)让我们再一次以热烈的掌声欢迎他们:预祝各参赛代表队在护理知识竞赛中赛出风格&#xff0c;赛出水平&#xff0c;取得满意的成绩。 (女)…...

    Elasticsearch:可配置的推理 API 端点分块设置

    作者&#xff1a;来自 Elastic Daniel Rubinstein Elasticsearch 开放推理 API 现已支持可配置的分块&#xff0c;以便在文档摄取时处理语义文本字段。 Elasticsearch 推理 API 允许用户利用各种提供商的机器学习模型执行推理操作。其中一个常见用例是在索引中支持用于语义搜索…...

    数据结构之链表(双链表)

    目录 一、双向带头循环链表 概念 二、哨兵位的头节点 优点&#xff1a; 头节点的初始化 三、带头双向链表的实现 1.双链表的销毁 2.双链表的打印 3.双链表的尾插和头插 尾插&#xff1a; 头插&#xff1a; 4.双链表的尾删和头删 尾删&#xff1a; 头删&#xff1a; …...

    uniapp从 vue2 项目迁移到 vue3流程

    以下是必须为迁移到 vue3 进行调整的要点&#xff0c;以便 vue2 项目可以在 vue3 上正常运行。 1. 在index.js中创建应用程序实例 // Before - Vue 2 import Vue from vue import App from ./App // with no need for vue3 Vue.config.productionTip false // vue3 is no lon…...

    案例:网络命名空间模拟隔离主机场景

    场景描述 假设我们需要在同一台物理机上模拟两台独立的主机&#xff08;Host A 和 Host B&#xff09;&#xff0c;它们分别位于不同的网络命名空间中&#xff0c;并通过虚拟以太网对&#xff08;veth pair&#xff09;进行通信。目标是展示网络命名空间的隔离性和跨命名空间的…...

    23种设计模式-生成器(Builder)设计模式

    工厂方法设计模式 &#x1f6a9;什么是生成器设计模式&#xff1f;&#x1f6a9;生成器设计模式的特点&#x1f6a9;生成器设计模式的结构&#x1f6a9;生成器设计模式的优缺点&#x1f6a9;生成器设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么…...

    算法训练营第二十二天 | 回溯算法(四)

    文章目录 前言一、Leetcode 491.递增子序列二、Leetcode 46.全排列三、Leetcode 47.全排列Ⅱ 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多人都开启…...

    NLP高频面试题(十一)——RLHF的流程有哪些

    随着大语言模型&#xff08;如GPT系列&#xff09;的快速发展&#xff0c;RLHF&#xff08;Reinforcement Learning from Human Feedback&#xff0c;即基于人类反馈的强化学习&#xff09;逐渐成为训练高质量模型的重要方法。本文将简单清晰地介绍RLHF的整体流程。 一、RLHF …...