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

相关推荐
lllsure2 小时前
Linux 实用指令
linux·物联网
努力的小T2 小时前
使用 Docker 部署 Apache Spark 集群教程
linux·运维·服务器·docker·容器·spark·云计算
Nerd Nirvana3 小时前
OpenSSL crt & key (生成一套用于TLS双向认证的证书密钥)
linux·ssl·shell·认证·加密·tls·oepnssl
亿道电子Emdoor3 小时前
【ARM】MDK如何生成指定大小的bin文件,并指定空区域的填充数据
arm开发·stm32·单片机
letisgo53 小时前
记录一次部署PC端网址全过程
linux·阿里云·服务器运维
猫猫的小茶馆4 小时前
【网络编程】UDP协议
linux·服务器·网络·网络协议·ubuntu·udp
尚墨11114 小时前
linux 安装启动zookeeper全过程及遇到的坑
linux·zookeeper
鱼嘻4 小时前
Linux自学day23-进程和线程
linux·服务器·c语言·进程和线程
AuGuSt_814 小时前
在windows下安装windows+Ubuntu16.04双系统(下)
linux·ubuntu·双系统
old_power4 小时前
Linux(Ubuntu24.04)源码编译安装OpenCV4.6.0
linux·opencv