当前位置: 首页 > article >正文

Linux IO编程核心要点解析:文件、流与缓冲区实战指南

文章目录

    • 1. Linux 文件类型
    • 2. IO 概念
    • 3. 系统调用 vs 库函数
    • 4. 流(Stream)的概念
    • 5. Windows 与 Linux 换行符
    • 6. 缓冲区类型
    • 7. 三种标准 IO 流
    • 8. 缓冲区行为演示(buffer.c)
    • 9. 关键函数总结


1. Linux 文件类型

类型描述示例
常规文件普通数据文件-.txt, .c, 二进制文件
目录文件存储文件路径信息d/home, /etc
字符设备按字符流访问的设备c终端 /dev/tty,键盘 /dev/input
块设备按数据块访问的设备b硬盘 /dev/sda,U盘 /dev/sdb1
链接文件文件快捷方式lln -s source.txt link_to_source

在这里插入图片描述


2. IO 概念

  • 输入设备:键盘(/dev/input)、鼠标。
  • 输出设备:显示器(/dev/fb0)、打印机。
  • 双向设备:U盘(/dev/sdb1)、网卡(eth0)。

3. 系统调用 vs 库函数

类型描述示例函数
系统调用操作系统直接提供的接口open(), read(), write()
库函数封装系统调用的高级接口fopen(), fread(), printf()

代码示例

// 系统调用直接操作文件描述符
int fd = open("file.txt", O_RDWR);
write(fd, "Hello", 5);

// 库函数封装为文件流操作
FILE *fp = fopen("file.txt", "w");
fprintf(fp, "Hello");

4. 流(Stream)的概念

  • 在 C 语言中,流是文件或设备的抽象,表示为 FILE 结构体。

  • 示例

    FILE *fp = fopen("data.txt", "r");  // 打开文件流
    char buffer[100];
    fgets(buffer, 100, fp);            // 从流中读取数据
    

5. Windows 与 Linux 换行符

  • Windows\r\n(回车 + 换行)。
  • Linux\n(仅换行)。
    代码适配
// 跨平台换行符处理
fprintf(fp, "Line1%c", '\n');  // Linux 正常,Windows 可能显示异常
fprintf(fp, "Line2\r\n");      // Windows 兼容

6. 缓冲区类型

类型描述触发条件示例场景
全缓冲缓冲区满后刷新默认文件操作普通文件读写
行缓冲遇到换行符或缓冲区满刷新终端(标准输入/输出)printf("Hello\n")
无缓冲直接写入设备标准错误流(即时显示错误)fprintf(stderr, ...)

代码示例

#include <stdio.h>
int main() {
    printf("Hello");  // 行缓冲,无换行符时可能不立即显示
    fflush(stdout);   // 手动刷新缓冲区
    return 0;
}
  • 默认缓冲区大小

    • 全缓冲(文件操作):通常为 BUFSIZ(定义在 <stdio.h> 中),在大多数系统中为 8192 字节(8KB)。
    • 行缓冲(终端输入/输出):通常为 1024 字节(但可能更小,如 512 字节)。
    • 无缓冲(如 stderr:数据直接写入设备,无缓冲区。
  • 查看默认值

    #include <stdio.h>
    printf("BUFSIZ = %d\n", BUFSIZ);  // 输出默认缓冲区大小
    

7. 三种标准 IO 流

流类型文件描述符宏定义默认设备
标准输入流0STDIN_FILENO键盘
标准输出流1STDOUT_FILENO显示器
标准错误流2STDERR_FILENO显示器

使用示例

// 从键盘读取输入
char input[100];
fgets(input, 100, stdin);

// 向屏幕输出错误
fprintf(stderr, "Error: File not found!\n");

8. 缓冲区行为演示(buffer.c)

#include <stdio.h>
#include <unistd.h>

int main() {
    printf("Hello");  // 行缓冲,无换行符时程序结束前不显示
    sleep(2);        // 休眠 2 秒
    // 若此处调用 _exit(0)(不刷新缓冲区),则 "Hello" 不会显示
    return 0;         // 正常退出会刷新缓冲区
}

9. 关键函数总结

操作系统调用库函数
打开文件open()fopen()
读取数据read()fread(), fgets()
写入数据write()fwrite(), fprintf()
关闭文件close()fclose()
设置缓冲区类型setvbuf()-

总结:Linux IO 编程需掌握文件类型、系统调用与库函数的区别、缓冲区机制及标准流的操作。通过合理使用缓冲策略和错误流,可以提升程序效率和健壮性。


http://www.kler.cn/a/570467.html

相关文章:

  • Python配置文件的全面解析与使用
  • WEB10(CTFshow)
  • 算法题笔记(自用)——Python
  • 编程题 - 汽水瓶【JavaScript/Node.js解法】
  • 【含文档+PPT+源码】基于SpringBoot和Vue的编程学习系统
  • CentOS 7 IP 地址设置保姆级教程
  • 动态扩缩容引发的JVM堆内存震荡:从原理到实践的GC调优指南
  • Spark核心之02:RDD、算子分类、常用算子
  • cursor for linux
  • MySQL 索引深度解析手册
  • 【二分查找】_240. 搜索二维矩阵 II
  • java常见面试01
  • 比特币暴跌背后
  • 【Elasticsearch】使用ILM自动化滚动操作
  • 基于log4j的自定义traceid实现
  • 推荐1款OCR的扫描仪软件,无需安装,打开即用!
  • µC/OS-III-事件标志
  • 【Golang学习之旅】Go-zero + Gen:如何使用 Gen 提升 Go 开发效率
  • Spark核心之05:sparkOnYarn、资源参数、调度模式、资源分配策略、shuffle机制??
  • 清华大学DeepSeek使用手册:6本502页大合集PDF下载