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

文件I/O概念

文件I/O(系统I/O)详解

1. 什么是文件I/O?

文件I/O(Input/Output),又称系统I/O或系统调用,是操作系统内核提供的一组API接口函数,用于应用程序与底层硬件(如磁盘、设备)之间的数据读写操作。

核心特点:

  • 无缓冲机制:文件I/O不提供用户空间的缓冲,每次读写都直接与内核交互
  • 直接系统调用:通过操作系统内核完成,性能开销相对较大
  • 底层操作:提供最基础的读写能力,适合需要精细控制的场景

2. 文件I/O的核心API函数

文件I/O提供了一组基础但强大的系统调用函数:

2.1 open() - 打开文件
intopen(constchar*pathname,intflags,mode_tmode);
  • 功能:打开或创建文件
  • 返回值:成功返回文件描述符,失败返回-1
  • 参数:
    • pathname:文件路径
    • flags:打开方式(O_RDONLY、O_WRONLY、O_RDWR等)
    • mode:文件权限(创建文件时使用)
2.2 close() - 关闭文件
intclose(intfd);
  • 功能:关闭已打开的文件描述符
  • 返回值:成功返回0,失败返回-1
  • 作用:释放系统资源,确保数据写入磁盘
2.3 read() - 读取数据
ssize_tread(intfd,void*buf,size_tcount);
  • 功能:从文件描述符读取数据
  • 返回值:成功返回读取的字节数,0表示文件结束,-1表示错误
  • 参数:
    • fd:文件描述符
    • buf:数据缓冲区
    • count:要读取的最大字节数
2.4 write() - 写入数据
ssize_twrite(intfd,constvoid*buf,size_tcount);
  • 功能:向文件描述符写入数据
  • 返回值:成功返回写入的字节数,-1表示错误
  • 参数:
    • fd:文件描述符
    • buf:数据缓冲区
    • count:要写入的字节数

3. 文件描述符详解

3.1 什么是文件描述符?

文件描述符(File Descriptor,简称fd)是一个非负整数,是Linux/Unix系统中用于标识已打开文件的抽象概念。

关键特性:

  • 每个打开的文件都对应一个唯一的文件描述符
  • Linux为程序中每个打开的文件分配一个文件描述符
  • 文件描述符从0开始分配,依次递增
  • 所有文件I/O操作都通过文件描述符来完成
3.2 标准文件描述符

Linux系统为每个进程预定义了三个标准文件描述符:

文件描述符名称默认设备用途
0STDIN_FILENO键盘标准输入
1STDOUT_FILENO显示器标准输出
2STDERR_FILENO显示器标准错误输出

示例代码:

#include<unistd.h>#include<stdio.h>intmain(){// 使用标准文件描述符charbuffer[100];write(STDOUT_FILENO,"请输入内容:",13);read(STDIN_FILENO,buffer,sizeof(buffer));write(STDOUT_FILENO,"你输入的是:",13);write(STDOUT_FILENO,buffer,sizeof(buffer));return0;}

4. 文件I/O与标准I/O的区别

特性文件I/O(系统I/O)标准I/O(库I/O)
缓冲机制无缓冲有缓冲(全缓冲、行缓冲、无缓冲)
性能每次调用都进入内核,开销大缓冲减少系统调用,性能更好
函数前缀无(open、read、write)带f(fopen、fread、fwrite)
错误处理通过errno和返回值通过errno和返回值
适用场景设备文件、网络套接字、需要精细控制普通文件、需要高性能读写

5. 文件I/O的典型使用流程

#include<fcntl.h>#include<unistd.h>#include<stdio.h>#include<errno.h>#include<string.h>intmain(){intfd;charbuffer[1024];ssize_tbytes_read,bytes_written;// 1. 打开文件fd=open("example.txt",O_RDWR|O_CREAT,0644);if(fd==-1){perror("打开文件失败");return1;}// 2. 写入数据char*data="Hello, File I/O!\n";bytes_written=write(fd,data,strlen(data));if(bytes_written==-1){perror("写入失败");close(fd);return1;}// 3. 移动文件指针到开头(准备读取)lseek(fd,0,SEEK_SET);// 4. 读取数据bytes_read=read(fd,buffer,sizeof(buffer)-1);if(bytes_read==-1){perror("读取失败");close(fd);return1;}buffer[bytes_read]='\0';// 添加字符串结束符// 5. 输出读取的内容write(STDOUT_FILENO,"读取的内容:",13);write(STDOUT_FILENO,buffer,bytes_read);// 6. 关闭文件if(close(fd)==-1){perror("关闭文件失败");return1;}return0;}

6. 常见错误处理

文件I/O操作必须进行错误检查:

intfd=open("file.txt",O_RDONLY);if(fd==-1){// 错误处理perror("open failed");fprintf(stderr,"错误代码:%d\n",errno);// 根据errno进行特定处理if(errno==ENOENT){fprintf(stderr,"文件不存在\n");}elseif(errno==EACCES){fprintf(stderr,"权限不足\n");}return1;}
http://www.jsqmd.com/news/1101222/

相关文章:

  • 别再死记硬背流水线公式了!用Python模拟单/双缓冲区磁盘读取,直观理解性能差异
  • Windows和Linux下PyTorch DataLoader的num_workers设置差异与避坑指南
  • 2026轮廓仪安装环境要求与隔振方案全解析
  • 图像直方图:作用、分类、如何按需选择/直方图均衡化、直方图匹配 黑白 / 彩色都能处理,但是用法完全不一样
  • 保姆级教程:手把手教你用Python还原同盾滑块验证码的撕裂图片(附完整代码)
  • AI编程合规风暴来临!GDPR+《生成式AI服务管理暂行办法》双约束下,企业代码审计必须完成的3项紧急加固
  • 从灵感捕捉到成稿交付:AI 辅助写作工作流的工程化实践
  • Sentinel-2数据预处理避坑指南:辐射定标时,90%的人会忽略的‘日地距离’单位问题
  • 基于OpenCV与YOLO的实时目标检测毕业设计实战指南
  • 2026 论文怎么降低 AIGC 检测率?专业降 AI 工具实操教程
  • pg_basebackup因权限不足无法备份
  • 杰理AC632蓝牙芯片ADC实战:从普通采样到音频LADC,两种模式到底怎么选?
  • 5分钟免费终极指南:如何用QrazyBox专业修复损坏的二维码
  • 从钢管运输到物流优化:一个20年前的数学建模题,如何启发今天的供应链算法设计?
  • 别再死记硬背了!用这5个真实案例帮你彻底搞懂欧姆龙PLC的CIO、WR、HR区到底怎么用
  • Hermes Agent:下一代 AI 编程助手,让开发效率翻倍
  • 别再只用PSNR/SSIM了!用LPIPS(感知损失)评估你的AI生成图像,更贴近人眼
  • 你知道DeepSeek还能这么用吗?尤其是最后一条。
  • 使用frida-il2cpp-bridge动态分析与修改Unity IL2CPP应用
  • EfficientNet-PyTorch:如何用1/10的计算量实现SOTA图像识别?[特殊字符]
  • 【Three】EdgesGeometry 和 wireframe 详细对比及使用说明
  • openEuler/CCA完全指南:从硬件隔离到远程证明的终极安全方案
  • 抖音动态监控助手:实时检测博主更新与开播推送
  • Dism++:Windows系统维护的深度解析与技术实践指南
  • Python+Appium移动端自动化测试:从环境搭建到CI/CD实战
  • 2026迪庆黄金回收白银回收铂金回收旧料回收怎么选?五家高实价铂金白银线下门店测评清单 + 联系方式
  • Token 账单的隐形刺客:LLM 推理成本监控体系的设计与实现
  • 大模型下测试方案改进探讨
  • GEO生成幻觉全链路抑制:从原理到三层拦截技术实操指南
  • 字符叠加 错漏重码日期喷码自动剔除