Linux 标准 I/O 库

目录

一、引言

[二、标准 I/O 库概述](#二、标准 I/O 库概述)

[三、标准 I/O 函数介绍](#三、标准 I/O 函数介绍)

1.fopen函数

2.fread和fwrite函数

3.fgets和fputs函数

4.fclose函数

[四、标准 I/O 库的缓存机制](#四、标准 I/O 库的缓存机制)

五、实际应用场景与示例代码

六、总结


一、引言

在 Linux 编程世界中,标准 I/O 库是至关重要的一部分。它为文件操作提供了高层抽象接口,极大地简化了程序员与文件系统交互的过程,使得输入输出操作更加方便、高效且可移植。

二、标准 I/O 库概述

Linux 标准 I/O 库是基于底层系统调用(如open、read、write等)构建而成,但对程序员隐藏了许多复杂的细节,例如缓存管理、字符编码转换等。其核心对象是流(FILE *),通过流来进行各种 I/O 操作,常见的流包括标准输入流(stdin)、标准输出流(stdout)和标准错误流(stderr),它们在程序启动时自动打开并可用。

三、标准 I/O 函数介绍

1.fopen函数

fopen用于打开一个文件并返回相应的流指针。其原型为FILE *fopen(const char *filename, const char *mode),filename是要打开的文件名,mode是打开文件的模式,如"r"(只读)、"w"(只写,若文件存在则截断)、"a"(追加写)等。成功打开文件后返回非空流指针,否则返回NULL。

2.fread fwrite 函数

fread用于从文件流中读取数据到指定的缓冲区,fwrite则相反,将缓冲区数据写入文件流。例如size_t fread(void *ptr, size_t size, size_t count, FILE *stream),ptr是存放读取数据的缓冲区,size是每个数据项的字节大小,count是数据项的数量,stream是目标文件流,函数返回实际读取的完整数据项数量。

3.fgets fputs 函数

fgets从流中读取一行字符串(包括换行符)到指定缓冲区,fputs将字符串写入流中。char *fgets(char *s, int size, FILE *stream),s是缓冲区地址,size是缓冲区大小,stream是输入流;int fputs(const char *s, FILE *stream),s是要写入的字符串,stream是输出流,fgets成功时返回s,遇到文件结尾或错误返回NULL,fputs成功返回非负整数,失败返回EOF。

4.fclose 函数

fclose用于关闭之前由fopen打开的文件流,释放相关资源,如缓存数据的刷新等,其原型为int fclose(FILE *stream),成功返回0,失败返回EOF。

四、标准 I/O 库的缓存机制

标准 I/O 库实现了自己的缓存策略,这是其高效性的重要体现。缓存分为全缓存、行缓存和无缓存三种类型:

  • 全缓存:对于普通文件的读写操作,数据会先缓存在内存缓冲区中,当缓冲区填满或者执行fflush函数时才进行实际的系统调用写入磁盘。例如通过fopen以"r"或"w"模式打开的文件流通常是全缓存的。
  • 行缓存:对于标准输入输出流(stdin、stdout)以及以"r+"、"w+"等模式打开的终端设备文件流,数据按行缓存。遇到换行符时,缓冲区数据会被刷新输出,或者当缓冲区满时也会刷新,如printf函数输出到stdout就是行缓存机制,当输出换行符或缓冲区满时才真正输出到终端。
  • 无缓存:对于一些特殊的流,如标准错误流stderr,数据不进行缓存,立即输出,保证错误信息能及时显示,这在调试程序时非常重要,fwrite函数在以"w"模式打开的文件流中,如果缓冲区未满且未调用fflush,数据不会立即写入文件,但fputs到stderr会立即输出。

五、实际应用场景与示例代码

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *src, *dst;
    char buffer[1024];
    size_t n;

    // 打开源文件和目标文件
    src = fopen("source.txt", "r");
    if (src == NULL) {
        perror("fopen source.txt");
        return EXIT_FAILURE;
    }
    dst = fopen("destination.txt", "w");
    if (dst == NULL) {
        fclose(src);
        perror("fopen destination.txt");
        return EXIT_FAILURE;
    }

    // 循环读取源文件并写入目标文件
    while ((n = fread(buffer, 1, sizeof(buffer), src)) > 0) {
        fwrite(buffer, 1, n, dst);
    }

    // 关闭文件
    fclose(src);
    fclose(dst);

    return 0;
}

在上述代码中,我们利用fopen打开源文件和目标文件,通过fread和fwrite以 1024 字节为单位循环复制文件内容,最后用fclose关闭文件流,体现了标准 I/O 库在文件复制操作中的基本应用。

六、总结

Linux 标准 I/O 库为文件操作提供了丰富、便捷且高效的接口,理解其函数使用方法、缓存机制以及在不同场景下的应用,对于 Linux 平台上的 C 语言编程至关重要。通过合理运用标准 I/O 库,我们能够更高效地处理文件输入输出,提升程序的性能和稳定性,为开发各种实用的 Linux 应用程序奠定坚实基础。

相关推荐
我是阿呆同学1 小时前
Linux平台下实现的小程序-进度条
linux·小程序
天地人-神君1 小时前
centos双网卡不能上网
linux·运维·centos
码韵2 小时前
【Ubuntu使用技巧】Ubuntu22.04无人值守Crontab工具实战详解
linux·运维·ubuntu
憧憬一下2 小时前
RK3399 PCIe 中断处理与映射分析(INTx中断机制源码分析)
arm开发·嵌入式硬件·嵌入式·linux驱动开发·pci/pcie
Acaibird.2 小时前
macos 远程开发,实现文件自动同步
linux·macos·ssh·远程开发
楚灵魈2 小时前
[Linux]从零开始的Nginx反向代理配置及运用教程
linux·运维·nginx
hkj88083 小时前
linux查看访问外网本机ip地址的命令
linux·运维·服务器
水饺编程3 小时前
简易CPU设计入门:本系统中的通用寄存器(三)
linux·fpga开发·硬件架构·硬件工程
码思途远3 小时前
工作中常用Vim的命令
linux·编辑器·vim
笑洋仟3 小时前
Linux postgresql-15部署文档
linux·运维·postgresql