尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

文件I/O概念

文件I/O概念
📅 发布时间:2026/7/1 8:10:08

文件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;}

相关新闻

  • Windows和Linux下PyTorch DataLoader的num_workers设置差异与避坑指南
  • AI编程合规风暴来临!GDPR+《生成式AI服务管理暂行办法》双约束下,企业代码审计必须完成的3项紧急加固
  • 基于OpenCV与YOLO的实时目标检测毕业设计实战指南

最新新闻

  • Wireshark抓包实战:TCP三次握手与四次挥手深度解析
  • 【AI编程工具终极对决】:Cursor与ChatGPT在真实开发场景中的5项硬核性能实测(2024工程师实测数据)
  • 3分钟解锁音乐自由:终极QQ音乐加密文件转换工具完全指南
  • d2s-editor:5分钟掌握暗黑破坏神2存档编辑的终极指南
  • 基于Si4731与PIC18的数字收音机设计与优化
  • 和 ThreadLocal 的区别

日新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

周新闻

  • Windows字体自定义终极方案:No!! MeiryoUI完全指南
  • Deepin Boot Maker:告别命令行,3分钟制作Linux启动盘的智能解决方案
  • Plain Craft Launcher 2:重新定义你的Minecraft游戏体验

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号