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

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

相关文章:

  • 多空狙击线-新指标-图文教程,多空分界买点以及强弱操盘技术教程,通达信炒股软件指标
  • 从DNS到TCP:DNS解析流程和浏览器输入域名访问流程
  • QKV 注意力机制在Transformer架构中的作用,和卷积在卷积神经网络中的地位,有哪些相似之处?
  • 使用vue3+element plus 的table自制的穿梭框(支持多列数据)
  • 【大厂AI实践】清华:清华古典诗歌自动生成系统“九歌”的算法
  • Linux下安装VS Code
  • HOW - 在Windows浏览器中模拟MacOS的滚动条
  • 栈和队列的模拟实现
  • 从暴力破解到时空最优:LeetCode算法设计核心思维解密
  • Metal学习笔记十:光照基础
  • 【jenkins配置记录】
  • I2C总线详细介绍
  • Kafka 主题 retention.ms 配置修改及深度问题排查指南
  • NAT,代理服务,内网穿透
  • rancher上强制删除处于Removing状态的集群
  • Spring MVC 返回数据
  • 梯度下降与反向传播
  • DeepSeek使用手册分享-附PDF下载连接
  • 人工智能丨ChatGPT 免费开放网络搜索,能否挑战 Google 的搜索霸主地位?
  • 001-码云操作
  • 怎么做网站关键词搜索/上海百度seo
  • 建设公司企业使命/北京seo管理
  • 福建石狮有做网站的没/网店运营工作内容
  • 北京市公司网站制作/百度安装app
  • 做系统那个网站好/百度页面推广
  • 学校网站开发4人小组分工/长尾词挖掘工具