Linux 文件 I/O 与标准 I/O 缓冲机制详解

一、什么是标准 I/O?(FILE* 接口)

标准 I/O 是 C 标准库为我们提供的一套高级文件操作接口,核心基于结构体 FILE,常见函数如:

  • fopen() / fclose()

  • fread() / fwrite()

  • fprintf() / fscanf()

  • fflush() / fseek() / ftell()

其背后的设计理念是:在用户空间加一层缓冲区机制,减少频繁的系统调用,提高 I/O 效率。


二、标准流与 FILE* 指针的关系

C 语言启动时自动打开的三个标准流:

名称

全局变量

描述

默认绑定设备

标准输入

stdin

键盘输入

文件描述符 0

标准输出

stdout

屏幕输出

文件描述符 1

标准错误输出

stderr

屏幕错误输出

文件描述符 2

它们本质上是三个全局变量指针:

 

extern FILE *stdin; // 标准输入

extern FILE *stdout; // 标准输出

extern FILE *stderr; // 标准错误

FILE 的结构体对象,这些对象在程序启动时已经初始化好,不需要手动打开。

三、标准 I/O 的缓冲机制分类

标准 I/O 相比 read()/write() 的一个显著特点是:内部使用了缓冲区机制(缓解频繁的系统调用)。

1. 无缓冲(Unbuffered)

  • 直接写入/读取,不做缓存。

  • 特征:每次 fputc()、fprintf(stderr, ...) 都是一次系统调用。

  • 示例:标准错误流 stderr 通常是无缓冲。

2. 行缓冲(Line Buffered)

  • 读写一整行再提交,或者满足以下任一条件立即刷新:

  1. 遇到换行符 \n

  2. 调用 fflush()

  3. 缓冲区被填满

  4. 程序正常退出

  • 示例:标准输出 stdout 在连接终端时通常是行缓冲。

3. 全缓冲(Fully Buffered)

  • 只有当缓冲区满时或显示调用 fflush() 时才进行 I/O 操作。

  • 示例:对磁盘文件操作通常是全缓冲。

关于缓冲区的大小

标准 I/O 缓冲区大小(来自 APUE 的描述)

标准 I/O 使用的是 用户空间的缓冲机制,而这部分缓冲区的大小通常为:

✅ BUFSIZ,大小通常是 8192 字节(即 8KB)

  • BUFSIZ 是一个宏,定义在 <stdio.h> 中,表示标准库默认的缓冲区大小。

  • 实际大小由系统实现决定,但大多数现代系统中是 8192 字节(8KB)。

  • 你可以通过下面代码查看具体大小:

 
 

#include <stdio.h> int main() { printf("BUFSIZ = %d\n", BUFSIZ); return0; }

🧠 说明一下:

  • 标准I/O函数(如 fopen/fread/fwrite)使用内部缓冲区,提高读写效率。

  • 这个缓冲区由 libc 实现,属于用户空间。

  • 不像 read() / write() 系统调用直接进入内核空间,标准IO通过一次性读写大块内容来减少系统调用次数。


🧪 补充说明:你还可以自己设定缓冲区

 
 

FILE *fp = fopen("file.txt", "r"); char buf[BUFSIZ]; setbuf(fp, buf); // 手动设置缓冲区

或者使用 setvbuf() 函数精细控制缓冲类型(全缓冲、行缓冲、无缓冲)和大小。

📝 总结

名称

值(常见)

定义位置

用途

BUFSIZ

8192 字节

<stdio.h>

标准I/O默认缓冲区大小

📌 注意:BUFSIZ 是用于标准IO缓冲(如 fopen),而不是 read() 等系统调用(后者不涉及标准IO缓冲机制)。

这里FILE结构体需要描述

FILE 结构体的典型定义(简化版)

FILE 的真实定义是不公开的(属于 libc 实现细节),但你可以在 GNU libc 或 musl 的源码中看到类似的简化结构:

 
 

typedef struct _IO_FILE { int _fileno; // 文件描述符,对应 open 返回的 int char *_buffer; // 指向缓冲区的指针 char *_bufpos; // 当前缓冲位置 char *_bufend; // 缓冲区末尾 int _flags; // 文件状态,如可读、可写、错误、EOF 等 long _pos; // 当前文件位置(用于 ftell、fseek) // 还有更多复杂字段... } FILE;

📌注意:不同系统实现(如 glibc、musl)中,这个结构体的字段名称和结构会有所不同。

🎯 FILE 和底层文件描述符的区别

项目

FILE(高级IO)

文件描述符(低级IO)

类型

FILE *(结构体指针)

int(整数)

接口

fopen, fread, fwrite 等

open, read, write 等

是否缓冲

✅ 有缓冲区(提高效率)

❌ 无缓冲(每次都直接系统调用)

是否格式化支持

✅ fprintf, fscanf

❌ 不支持格式化


🧠 标准流的 FILE 示例

C语言一开始默认打开了三个标准流(在 <stdio.h> 中定义):

extern FILE *stdin; // 标准输入 extern FILE *stdout; // 标准输出 extern FILE *stderr; // 标准错误

你可以直接使用这些来读写数据:

fprintf(stdout, "Hello\n"); fscanf(stdin, "%d", &num);


🧪 进阶:缓冲机制与 FILE

  • FILE 内部包含了一个缓冲区,默认大小是 BUFSIZ(通常是 8192 字节)。

  • 分为:

  • 全缓冲(默认情况,大文件使用)

  • 行缓冲(用于终端)

  • 无缓冲(stderr)

你可以用 setvbuf() 或 setbuf() 控制缓冲方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/84831.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/84831.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++的前世今生-C++11

C98&#xff08;ISO/IEC 14882:1998&#xff09; C98 是 C 的第一个标准化版本&#xff08;ISO/IEC 14882:1998&#xff09;&#xff0c;它正式确立了 C 的核心语言特性和标准库。以下是 C98 的主要特性总结&#xff1a; 一、核心语言特性** 模板&#xff08;Templates&…

词编码模型怎么进行训练的,输出输入是什么,标签是什么

词编码模型怎么进行训练的,输出输入是什么,标签是什么 词编码模型的训练本质是通过数据驱动的方式,将离散的文本符号映射为连续的语义向量。 一、训练机制:从符号到向量的映射逻辑 1. 核心目标 将单词/子词(Token)映射为低维向量,使语义相关的词在向量空间中距离更近…

【Linux指南】文件管理高级操作(复制、移动、查找)

引言 在Linux系统管理中&#xff0c;文件的复制、移动与查找是比基础操作更进阶的核心技能&#xff0c;它们构成了高效管理文件系统的"三驾马车"。当我们需要备份重要数据、重构目录结构或在庞大的文件系统中定位目标文件时&#xff0c;cp、mv、find等命令将成为最得…

【栈】-----【小C的记事本】

小C的记事本 题目描述 小C最近学会了 Java 小程序的开发&#xff0c;他很开心&#xff0c;于是想做一个简单的记事本程序练练手。 他希望他的记事本包含以下功能&#xff1a; append(str)&#xff1a;向记事本插入字符串 str&#xff08;英文字符&#xff09;。delete(k)&am…

技能系统详解(2)——特效表现

特效会有个EffectManager用于统一管理所有特效&#xff0c;技能特效只是各类特效中的一种 EffectManager需要提供特效的创建&#xff0c;返回被封装为EffectHandle 每类特效都有各种不同的配置参数&#xff0c;这些配置参数会传递给EffectManager用于生成EffectHandler 为支…

12.OpenCV—基础入门

01读取图像 02创建空白图像 03保存图像 04更改图像亮度 05更改图像对比度 06灰度直方图均衡 07彩色直方图均衡 08五种滤波方式 09形态学操作 10仿射变换 11角度缩放仿射变换 12透视变换 13坐标映射 14模板匹配 15多模板匹配 16查找轮廓线 17轮廓线匹配 17绘制…

【Python】Python之什么是生成器?什么是迭代器?

目录 专栏导读前言什么是迭代器&#xff08;Iterator&#xff09;&#xff1f;迭代器的定义迭代器协议可迭代对象 vs 迭代器自定义迭代器迭代器的优势 什么是生成器&#xff08;Generator&#xff09;&#xff1f;生成器的定义生成器函数生成器表达式复杂的生成器示例生成器的状…

Python中实现简单爬虫并处理数据

在当今数据驱动的时代&#xff0c;能够从互联网上高效地抓取信息变得越来越重要。Python因其简洁易学的特性&#xff0c;成为了编写网络爬虫的首选语言之一。接下来&#xff0c;我将介绍如何使用Python来实现一个基础的网络爬虫&#xff0c;并对收集到的数据进行初步处理。 首先…

免费wordpress主题网

免费WordPress主题网 WP模板牛 WP模板牛是一个提供免费WordPress主题的网站&#xff0c;用户可以在这里找到大量高质量的模板&#xff0c;适用于各种网站类型。该网站致力于为用户提供简单、高效的建站体验。 官网链接&#xff1a; https://wpniu.com 建站哥模板 建站哥模板…

为什么需要MyBatis-Plus条件构造器?

目录 前言 一、传统SQL编写的痛点 二、条件构造器的核心优势 1. 防SQL注入&#xff08;安全性&#xff09; 2. 面向对象编程&#xff08;可读性&#xff09; 3. 动态条件构建&#xff08;灵活性&#xff09; 4. 数据库无关性&#xff08;可移植性&#xff09; 三、典型应…

【从零学习JVM|第九篇】常见的垃圾回收算法和垃圾回收器

前言&#xff1a; 我们知道在堆内存中&#xff0c;会有自动的垃圾回收功能&#xff0c;那今天这篇文章将会向你介绍&#xff0c;这个功能实现的方式&#xff0c;还有实现的对象&#xff0c;接下来就由我来给你们详细介绍垃圾回收的算法和实现算法的回收器。 目录 前言&#…

品牌窜货治理解决方案

在渠道网络的暗潮中&#xff0c;窜货犹如隐秘的漩涡&#xff0c;某知名白酒品牌曾因区域窜货导致终端价格体系崩溃&#xff0c;半年内损失超3亿元。窜货行为不仅破坏市场秩序&#xff0c;更会引发信任危机。随着电商平台的多元化与分销层级的复杂化&#xff0c;品牌方亟需构建一…

车载电子电器架构 --- 法律和标准对电子电气架构的影响

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

一种通用跨平台实现SEH的解决方案

一. 前言 众所周知&#xff0c;在软件的代码中&#xff0c;处理软件本身的逻辑只要大约1/3的代码&#xff0c;另外2/3的代码实际上是在处理各种各样的异常情况。 这些异常情况一方面是因为不同用户之间不同的硬件软件环境要处理。另一方面是程序中可能出现的bug。比较典型的情…

25.6.19学习总结

什么是堆&#xff08;Heap&#xff09;&#xff1f; 堆是一种特殊的树形数据结构&#xff0c;它满足以下两个主要属性&#xff1a; 结构性&#xff08;完全二叉树&#xff09;&#xff1a; 堆总是一个完全二叉树 (Complete Binary Tree)。这意味着&#xff0c;除了最后一层&am…

【前后前】导入Excel文件闭环模型:Vue3前端上传Excel文件,【Java后端接收、解析、返回数据】,Vue3前端接收展示数据

【前后前】导入Excel文件闭环模型&#xff1a;Vue3前端上传Excel文件&#xff0c;【Java后端接收、解析、返回数据】&#xff0c;Vue3前端接收展示数据 一、Vue3前端上传&#xff08;导入&#xff09;Excel文件 ReagentInDialog.vue <script setup lang"ts" na…

网络基础入门:从OSI模型到TCP/IP协议详解

网络基础入门&#xff1a;从OSI模型到TCP/IP协议详解 一、网络基础概念与OSI七层模型 1.1 网络通信的本质 计算机网络的核心是将抽象语言转换为二进制数据进行传输与计算&#xff0c;这一过程涉及多层抽象与转换&#xff1a; 应用层&#xff1a;人机交互—抽象语言------编…

Linux致命漏洞CVE-2025-6018和CVE-2025-6019

Qualys 最近披露了两个影响主流 Linux 发行版的本地权限提升 (LPE) 漏洞&#xff0c;分别是 CVE-2025-6018 和 CVE-2025-6019。这两个漏洞可以被串联利用&#xff0c;使得非特权用户在几秒钟内获得系统的 root 权限&#xff0c;从而实现对系统的完全控制。 一、漏洞详情 这两…

【Docker基础】Docker镜像管理:docker push详解

目录 引言 1 Docker镜像推送基础概念 1.1 什么是Docker镜像推送 1.2 镜像仓库概述 1.3 镜像标签与版本控制 2 docker push命令详解 2.1 基本语法 2.2 常用参数选项 2.3 实际命令示例 2.4 推送流程 2.5 步骤描述 3 镜像推送实践示例 3.1 登录管理 3.2 标签管理 3…

FPGA基础 -- Verilog行为建模之循环语句

行为级建模&#xff08;Behavioral Modeling&#xff09;是 Verilog HDL 中最接近软件编程语言的一种描述方式&#xff0c;适用于功能建模和仿真建模的初期阶段。在行为级中&#xff0c;循环语句&#xff08;loop statements&#xff09;是常见且重要的控制结构&#xff0c;用于…