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

文件 IO

一、总述

Linux 中除网口外 “一切皆文件”,文件操作分为两类:标准文件 IO(C 语言标准库函数)和系统文件 IO(操作系统直接提供的接口)。

二、标准文件 IO
  1. 定义:基于 C 语言标准库的文件操作函数,封装了底层细节。

  2. 核心函数(含功能、参数、返回值):

函数名功能说明参数返回值
fopen以指定方式打开文件path(文件路径及名)、mode(打开方式,如 r、w、a 等)成功返回 FILE 指针,失败返回 NULL 且设置 errno
fread读取文件数据ptr(存储数据的地址)、size(每次读取字节数)、nmemb(读取次数)、stream(FILE 指针)返回完整读取的 nmemb 数
fwrite向文件写入数据ptr(待写入数据地址)、size(每次写入字节数)、nmemb(写入次数)、stream(FILE 指针)返回完整写入的 nmemb 数
fclose关闭文件stream(待关闭的 FILE 指针)成功返回 0,失败返回 EOF 且设置 errno
fseek移动文件指针stream(FILE 指针)、offset(偏移字节数)、whence(基准位置:SEEK_SET/SEEK_CUR/SEEK_END)成功返回 0,失败非 0
ftell获取当前文件指针位置stream(FILE 指针)返回相对于文件头的字节数
rewind将文件指针定位到文件开头stream(FILE 指针)无返回值(等效于 fseek (stream, 0, SEEK_SET))
remove删除指定文件pathname(文件路径)成功返回 0,失败返回 - 1
rename重命名文件old(原名称)、new(新名称)成功返回 0,失败返回 - 1
  1. 其他常用函数:fputc、fputs、putc、putchar、puts(写入字符 / 字符串);fgetc、fgets、getc、getchar(读取字符 / 字符串)。

三、系统文件 IO
  1. 定义:操作系统直接提供的接口,直接与内核交互。

  2. 核心函数:open、read、write、close(文档未详细说明参数及返回值,仅列出名称)。

四、标准文件 IO 与系统文件 IO 的差异
对比项标准文件 IO系统文件 IO
缓存机制默认使用缓冲区,数据先写入缓冲区,满足条件后执行实际操作;作用是减少系统调用次数,提升效率无默认缓冲区,每次操作均为系统调用,效率较低
跨平台性接口由 C 标准定义,与操作系统无关,同一代码可跨平台运行,跨平台性强接口由操作系统决定,不可跨平台
操作对象操作对象为FILE*(封装了文件描述符、缓冲区等信息)Linux 下操作对象为文件描述符,Windows 下为句柄
使用场景通常用于用户态下的操作一般用于底层设备驱动文件等控制

关键问题

  1. 问题:标准文件 IO 和系统文件 IO 的核心差异体现在哪些方面?两者的效率为何有差异? 答案:核心差异体现在四方面:①缓存机制(标准 IO 有默认缓冲区,系统 IO 无);②跨平台性(标准 IO 强,系统 IO 弱);③操作对象(标准 IO 为 FILE*,系统 IO 在 Linux 下为文件描述符);④使用场景(标准 IO 用于用户态,系统 IO 用于底层控制)。效率差异源于缓存机制:标准 IO 通过缓冲区减少系统调用次数,降低内核态与用户态切换开销,因此效率更高;系统 IO 每次操作直接调用内核,开销大,效率较低。

  2. 问题:使用 fopen 函数时,不同打开方式(r、w、a 等)的核心区别是什么? 答案:fopen 的打开方式决定了文件的操作权限和指针初始位置:①r/r+:只读 / 读写,文件必须存在,指针始于文件头;②w/w+:只写 / 读写,文件不存在则创建,存在则清空,指针始于文件头;③a/a+:追加 / 读 + 追加,文件不存在则创建,写操作指针始于文件尾,a + 的读操作指针始于文件头。

  3. 问题:在实际开发中,如何选择使用标准文件 IO 还是系统文件 IO? 答案:需根据场景判断:①若需跨平台开发(如同时适配 Linux 和 Windows),优先选标准文件 IO;②若操作底层设备(如驱动文件)或需要直接与内核交互,选择系统文件 IO;③若追求用户态操作效率(减少系统调用),标准文件 IO 更合适;④若需精确控制 IO 过程(无缓存干扰),可选用系统文件 IO。

http://www.xdnf.cn/news/1274275.html

相关文章:

  • MySQL 子查询
  • 大模型时代的机器人研究趋势:从多模态融合到高效迁移
  • Flutter 与 Android NDK 集成实战:实现高性能原生功能
  • wordpress文章摘要调用的3种方法
  • AI(1)-神经网络(正向传播与反向传播)
  • String AOP、事务、缓存
  • Java数据结构——LinkedList
  • Python与MySQL数据库交互实践:自动化数据插入系统
  • Radiology:经颅交流电刺激调节轻度阿尔茨海默病皮层与海马功能连接
  • 【Docker实战】将Django应用容器化的完整指南
  • YOLOv8算法改进--通过yaml文件添加注意力机制【附代码】
  • 从Redisson源码角度深入理解Redis分布式锁的正确实现
  • JavaScript垃圾回收机制
  • 106-基于Flask的重庆充电桩投建数据可视化分析系统
  • Redis 监控与优化方案(C++项目)
  • ShadowKV 机制深度解析:高吞吐长上下文 LLM 推理的 KV 缓存“影子”方案
  • WSL创建虚拟机配置VNC
  • ADK【4】内置前端调用流程
  • Python数据分析常规步骤整理
  • [论文阅读] 人工智能 + 软件工程 | 大型语言模型对决传统方法:多语言漏洞修复能力大比拼
  • C# 中常用集合以及使用场景
  • 服务器硬件电路设计之 I2C 问答(三):I2C 总线上可以接多少个设备?如何保证数据的准确性?
  • Redis如何实现一个分布式锁?
  • ubuntu22.04安装autoware.universe
  • 进度、质量、安全的关系随笔
  • scala 样例类
  • 计算机视觉(CV)——图像相关基本概念
  • #C语言——刷题攻略:牛客编程入门训练(八):分支控制(二)
  • 7、西门子PLC基础术语:数据单位、存储区域、寻址方式、字节序
  • scanpy单细胞转录组python教程(二):单样本数据分析之数据质控