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结构体与缓冲机制原理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aFakeProgramer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值