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

Linux 文件IO与标准IO的区别解析

1 文件IO与标准IO

 

1.1📌 文件IO(低级IO)  

定义:Linux系统调用提供的IO操作方式,通过文件描述符(fd)操作文件  

核心标识:文件描述符(fd)是一个非负整数(≥0),用于标识已打开的文件  

缓冲机制:无内置缓冲,直接读写文件,代码简洁  

关键函数:open()、read()、write()、close()  

内核关联:每个打开文件对应内核中的struct file结构体,存储文件类型、权限、大小、修改时间、读写位置等属性  

操作流程:int fd = open(...) → 通过fd执行read()/write()/属性查询  

例子

在这个例子中,open() 函数被用来打开或创建一个文件用于写入;write() 函数则用于将传感器的数据直接写入到指定的文件中。这种方式非常适合于需要高效处理大量数据的应用场景,同时还能提供对数据写入过程的高度控制。

#include <fcntl.h>
#include <unistd.h>
#include <errno.h>void saveSensorData(int data) {int fd = open("/path/to/sensor_data.bin", O_WRONLY | O_CREAT | O_APPEND, 0644);if (fd == -1) {perror("Failed to open file");return;}// 直接写入二进制数据ssize_t written = write(fd, &data, sizeof(data));if (written == -1) {perror("Error writing to file");} else if (written != sizeof(data)) {fprintf(stderr, "Incomplete write to file\n");}close(fd);
}

1.2📌 标准IO(高级IO)


 

定义:C语言标准库提供的IO操作方式,基于文件IO封装  

核心标识:FILE指针(称为“流”),封装了fd和缓冲机制(读缓冲、写缓冲)  

缓冲机制:自动处理数据缓冲与刷新,减少IO次数,提升效率并保护硬件  

关键函数:fopen()、fread()、fwrite()、fclose()  

操作流程:FILE stream = fopen(...) → 通过stream执行fread()/fwrite()  

例子

  • 创建一个名为 example.txt 的文件。
  • 向该文件中写入若干行文本信息。
  • 重新打开该文件并读取其内容,然后打印到控制台。
示例代码(C语言)
#include <stdio.h>
#include <stdlib.h>#define FILENAME "example.txt"int main() {// 写入数据到文件FILE *file = fopen(FILENAME, "w"); // 使用"w"模式打开文件用于写入if (file == NULL) {perror("Failed to open file for writing");return EXIT_FAILURE;}fprintf(file, "Hello, world!\nThis is a test file.\n");fclose(file); // 关闭文件// 从文件读取数据file = fopen(FILENAME, "r"); // 使用"r"模式打开文件用于读取if (file == NULL) {perror("Failed to open file for reading");return EXIT_FAILURE;}char buffer[100];while (fgets(buffer, sizeof(buffer), file) != NULL) { // 按行读取文件内容printf("%s", buffer); // 打印每一行的内容}fclose(file); // 关闭文件return EXIT_SUCCESS;
}
解释
  • 写入部分:

    • 使用 fopen() 函数以写入模式 ("w") 打开或创建一个文件。如果文件已经存在,它会被截断为零长度;如果不存在,则会创建新文件。
    • 使用 fprintf() 函数格式化输出文本到文件中。
    • 最后通过 fclose() 函数关闭文件,确保所有缓冲的数据都被写入磁盘。
  • 读取部分:

    • 再次使用 fopen() 函数,这次是以只读模式 ("r") 打开之前创建的文件。
    • 使用 fgets() 函数按行读取文件内容到缓冲区中,并用 printf() 输出到控制台。
    • 完成读取后同样调用 fclose() 来关闭文件。

此示例展示了标准IO库在处理普通文本文件时的便捷性和灵活性,包括了文件的创建、写入、关闭、重新打开以及读取等基本操作。标准IO库提供了丰富的接口来简化文件处理流程,适用于大多数文本处理任务。

1.3🔍 文件IO 与 标准IO 核心区别对比表

对比维度文件IO(系统调用)标准IO(C标准库函数)
缓冲机制无缓冲(或由用户手动控制),数据直接写入内核有缓冲机制(全缓冲、行缓冲、不缓冲),自动管理刷新
函数来源操作系统内核提供的系统调用(如 read, writeC标准库函数(如 fread, fwrite, fprintf
跨平台性依赖具体操作系统(如Linux、Unix),可移植性差跨平台一致性好,遵循ANSI C标准,可移植性强
操作入口文件描述符(int fd,非负整数)文件流指针(FILE *,封装了缓冲区和状态信息)
底层原理直接与内核交互,进入内核态执行封装了系统调用,在用户空间增加缓冲层
性能特点开销小,适合高频、实时或大吞吐场景因缓冲减少系统调用次数,通常更高效于文本操作
典型函数open(), close(), read(), write(), lseek()fopen(), fclose(), fread(), fwrite(), fgets(), fprintf()
适用场景二进制文件处理、设备驱动、socket网络编程、实时数据采集(如传感器)文本文件读写、日志记录、格式化输入输出等通用场景
错误处理方式返回 -1,通过 errno 获取错误码返回 NULLEOF,通过 ferror()perror() 判断

✅ 总结建议:

  • 使用文件IO:当你需要精细控制I/O行为、访问底层设备或追求极致性能时(如嵌入式系统、操作系统开发)。
  • 使用标准IO:在大多数应用程序开发中,尤其是涉及文本处理、格式化输出时,标准IO更简洁、安全且可移植。

掌握两者的差异,有助于根据实际需求选择合适的I/O编程模型。

1.4💡 学习建议  

初期学习需抽象理解函数调用方式,避免陷入系统调用实现细节  

后续结合源码深入理解内核struct file结构体与缓冲机制原理

http://www.dtcms.com/a/319824.html

相关文章:

  • wordpress安装环境推荐php8.0+mysql5.7
  • Linux Docker 新手入门:一文学会配置镜像加速器
  • 谷歌推出Genie3:世界模型的ChatGPT时刻?
  • 8.3.1 注册服务中心Etcd
  • MHA架构实战
  • 我在学习spring 项目构建时遇到问题,解决JDK最低版本只有17的问题
  • 佳文赏读 || 冶炼钒钛矿高炉操作炉型计算模拟研究
  • 【大前端】vite忽略指定前缀的静态资源
  • 移动端 WebView 登录异常与会话恢复问题全流程排查指南
  • 灯哥FOC笔记-----(1)无刷电机概论和硬件控制原理
  • 高精度惯性导航IMU供应商价格选型
  • 面向制造业的 AI Agent 架构与实战:任务驱动的智能协同新路径
  • 常见命令-资源查看-iostat命令实践
  • React 中 Context(上下文)介绍
  • ReAct Agent 原生代码实现(纯Python实现)
  • OpenAI推出开源GPT-oss-120b与GPT-oss-20b突破性大模型,支持商用与灵活部署!
  • 使用RestTemplate发送与接收http/https请求
  • 告别YAML,在SpringBoot中用数据库配置替代配置文件
  • 【JS】扁平树数据转为树结构
  • [激光原理与应用-172]:测量仪器 - 能量(焦耳)与功率(瓦)的图示比较
  • 14-netty基础-手写rpc-提供方(服务端)-06
  • Java NIO 核心原理与秋招高频面试题解析
  • day28-NFS
  • iOS混淆工具使用,后续维护与版本升级中实用的混淆策略
  • 代码随想录day58图论8
  • windows操作系统定时关机、重启指令记录
  • 一周学会Matplotlib3 Python 数据可视化-坐标轴 (Axis)
  • 进程间数据的关联与隔离
  • 管家婆软件如何设置默认税率?
  • AI创新中心从“空间集聚”到“生态共生”