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

相关推荐
xuanzdhc2 小时前
Linux 基础IO
linux·运维·服务器
愚润求学2 小时前
【Linux】网络基础
linux·运维·网络
bantinghy2 小时前
Linux进程单例模式运行
linux·服务器·单例模式
小和尚同志3 小时前
29.4k!使用 1Panel 来管理你的服务器吧
linux·运维
帽儿山的枪手3 小时前
为什么Linux需要3种NAT地址转换?一探究竟
linux·网络协议·安全
shadon1789 天前
回答 如何通过inode client的SSLVPN登录之后,访问需要通过域名才能打开的服务
linux
小米里的大麦9 天前
014 Linux 2.6内核进程调度队列(了解)
linux·运维·驱动开发
算法练习生9 天前
Linux文件元信息完全指南:权限、链接与时间属性
linux·运维·服务器
忘了ʷºᵇₐ9 天前
Linux系统能ping通ip但无法ping通域名的解决方法
linux·服务器·tcp/ip
浩浩测试一下9 天前
渗透测试指南(CS&&MSF):Windows 与 Linux 系统中的日志与文件痕迹清理
linux·运维·windows·安全·web安全·网络安全·系统安全