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 应用程序奠定坚实基础。

相关推荐
菜_小_白9 分钟前
codex
linux·vscode·ai
zhangrelay19 分钟前
用ROS2Lyrical实验报告册思路重做蓝桥云课ROS1实验并改进
linux·笔记·学习·ubuntu·机器人
林兴洋26 分钟前
linux-mtr命令-ping和traceroute的能力合二为一
linux
OsDepK40 分钟前
OSMDE_v1.9.0已加入FTP与shell功能
linux·运维·服务器
硅基手札1 小时前
【Linux内核专栏 11】驱动框架:platform / char / misc / 设备树
linux·运维·服务器
女神下凡1 小时前
芯参谋(40):UFS 电路设计指南
arm开发·单片机·嵌入式硬件·设计规范
倒头就睡的小比特2 小时前
Linux基础指令初步认识
linux
Starry-sky(jing)2 小时前
watchdog: BUG: soft lockup - CPU#3 stuck for 22s! 怎么排查——从寄存器 dump 到自旋锁争用根因
linux·内核·服务器运维·soft lockup·性能排查
DongQiShanRen2 小时前
裁决台账双向互校(上):名册与实物的第一道对账
java·linux·运维·数据库·人工智能·自然语言处理·数据挖掘
ShineWinsu2 小时前
对于Redis:AOF持久化的解析
linux·数据库·redis·缓存·面试·持久化·aof