C/C++标准IO的缓冲区

文章目录

  • 缓冲区的分类
  • 缓冲区的刷新时机

缓冲区的分类

  1. 行缓存:和终端文件相关的缓冲区叫做行缓存,行缓冲区的大小为1024字节,对应的文件指
    针:stdinstdout
  2. 全缓存:和外界文件相关的缓冲区叫做全缓存,全缓冲区的大小为4096字节,对应的文件指
    针:fp
  3. 不缓存:和标准出错相关的缓冲区叫不缓存,不缓存的大小为0字节,对应的文件指针:
    stderr

验证过程:

#include<stdio.h>
#include<iostream>using namespace std;int main(int argc, const char *argv[])
{//如果缓冲区没有被使用,则大小为0//只有被至少使用一次后,缓冲区的大小就确定了//1.可以通过两个方式求出行缓存的大小:1024//标准输出printf("行缓存的大小为:%d\n", stdout->_IO_buf_end - stdout->_IO_buf_base); //0//看似没使用,实际上打印文字也算使用printf("行缓存的大小为:%d\n", stdout->_IO_buf_end - stdout->_IO_buf_base); //1024//标准输入printf("行缓存的大小为:%d\n", stdin->_IO_buf_end - stdin->_IO_buf_base); //0int num = 0;//两种输入都可以//scanf("%d", &num);//Ccin >> num;//C++printf("行缓存的大小为:%d\n", stdin->_IO_buf_end - stdin->_IO_buf_base); //1024//2.验证全缓存的大小为4096FILE *fp = NULL;if((fp = fopen("./ff.txt","r")) == NULL){perror("fopen error");return -1;}//未使用时printf("全缓存的大小为:%d\n", fp->_IO_buf_end - fp->_IO_buf_base); //0//使用一次全缓存fgetc(fp);printf("全缓存的大小为:%d\n", fp->_IO_buf_end - fp->_IO_buf_base); //4096//3.验证不缓存的大小为0//未使用时printf("不缓存的大小为:%d\n", stderr->_IO_buf_end - stderr->_IO_buf_base); //0//使用一次不缓存perror("test error");printf("不缓存的大小为:%d\n", stderr->_IO_buf_end - stderr->_IO_buf_base); //0return 0;
}

验证结果:
在这里插入图片描述

缓冲区的刷新时机

对于三种缓冲区,都可以使用缓冲区刷新函数fflush来手动刷新。

#include <stdio.h> /*
功能:刷新给定的文件指针对应的缓冲区 
参数:文件指针 
返回值:成功返回0,失败返回EOF并置位错误码
*/
int fflush(FILE *stream); 

除了手动刷新,遇到以下情况缓冲区也会自动刷新:

  • 行缓存
    1. 当程序结束后
    2. 当遇到换行时
    3. 当输入输出发生切换时
    4. 当关闭行缓存对应的文件指针时
    5. 当缓冲区满了后(行缓存大小:1024字节)

示例:

#include<stdio.h>
#include<iostream>using namespace std;int main(int argc, const char *argv[])
{//1.当程序结束后printf("hello");return 0;//2.当遇到换行时printf("hello\n");while(1);//防止程序结束//3.当输入输出发生切换时int num = 0;printf("请输入:");scanf("%d", &num);//4.当关闭行缓存对应的文件指针(stdin stdout stderr)时printf("hello");fclose(stdout);    while(1);//防止程序结束//5.当缓冲区满了后(行缓存大小:1024字节)for(int i = 0; i < 1025; i++) { printf("A"); }while(1); //防止程序结束return 0;
}
  • 全缓存
    1. 当程序结束后
    2. 当输入输出发生切换时
    3. 当关闭缓冲区对应的文件指针时
    4. 当缓冲区满了后(全缓存大小:4096字节)

示例:

#include<iostream> 
#include<stdio.h> using namespace std; 
int main(int argc, const char *argv[])
{//打开一个文件 FILE *fp = NULL; if((fp = fopen("./aa.txt", "r+")) == NULL) //以读写的形式打开文件 { perror("fopen error"); return -1; }//1.当程序结束后 fputs("hello world!\n", fp);return 0;//2.当输入输出发生切换时fputs("I love China\n", fp); //向文件中输出一个字符串 fgetc(fp); //从文件中读取一个字符,主要是让输入输出发生切换 while(1);//3.当关闭缓冲区对应的文件指针时fputs("北京欢迎你", fp); fclose(fp); //刷新文件指针 while(1);//4.当缓冲区满了后(全缓存大小:4096字节)for(int i = 0; i < 4097; i++) { fputc('A', fp); //循环将单字符放入文件中}while(1); //防止程序结束return 0;
}
  • 不缓存
    1.只要放入数据就会刷新缓冲区

示例:

#include<iostream> 
#include<stdio.h> using namespace std; 
int main(int argc, const char *argv[]) 
{ //perror("a"); //向标准出错中放入数据 fputs("A", stderr); //向标准出错缓冲区中写入一个字符A while(1); //阻塞 return 0; 
}

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

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

相关文章

大屏数据看板一般是用什么技术实现的?

我们看到过很多企业都会使用数据看板&#xff0c;那么大屏看板的真正意义是什么呢&#xff1f;难道只是为了好看&#xff1f;答案当然不仅仅是。 大屏看板不仅可以提升公司形象&#xff0c;还可以提升企业的管理层次。对于客户&#xff0c;体现公司实力和品牌形象&#xff0c;…

HarmonyOS 本地真机运行

目录 官网地址 1.开发工具设置签名 2.手机开启开发者模式 3.使用USB连接方式 4.使用无线调试连接方式 5.常见的问题 官网地址 使用真机运行应用 使用本地真机运行应用/服务 1.开发工具设置签名 官网应用/服务签名 1.左上角文件--项目结构-勾选自动生成签名-Sign in登录 2…

单片机学习(18)--红外遥控器

红外遥控器 17.1红外遥控的基础知识1.红外遥控简介2.硬件电路3.基本发送和接收4.NEC编码5.遥控器键码6.51单片机的外部中断7.外部中断寄存器 17.2红外遥控的程序代码1.红外遥控&#xff08;1&#xff09;工程目录&#xff08;2&#xff09;main.c函数&#xff08;3&#xff09;…

pyenv-win | python版本管理,无需卸载当前版本

系统&#xff1a;windows&#xff0c;且已安装git。 使用 pyenv-win 在Windows中管理多个python版本&#xff0c;而无需卸载当前版本。安装步骤如下&#xff1a; 安装 pyenv-win 1. 安装 Git 和 pyenv-win: git clone https://github.com/pyenv-win/pyenv-win.git %USERPRO…

fastadmin 搜索调整的配置

//快捷搜索,这里可在控制器定义快捷搜索的字段search: false,//启用普通表单搜索commonSearch: true,//显示导出按钮showExport: false,//启用跨页选择maintainSelected: false,//启用固定列fixedColumns: false,//固定左侧列数fixedNumber: 3,//固定右侧列数fixedRightNumber:…

vue 两个页面切换, 再回到当前页,还是离开前的数据

1、要保证页面的name 和 建路由的大小写一致 2、页面不用生命周期--activated 调接口刷新

第G2周:人脸图像生成(DCGAN)

本文为365天深度学习训练营 中的学习记录博客 原作者&#xff1a;K同学啊 深度卷积对抗网络&#xff08;Deep Convolutional Generative Adversarial Networks&#xff0c;简称DCGAN&#xff09;是一种深度学习模型&#xff0c;由生成器&#xff08;Generator&#xff09;和判别…

四、GD32 MCU 常见外设介绍 (6) ADC 模块介绍

6.1.ADC 基础知识 12 位逐次逼近式模数转换器模块&#xff08;ADC&#xff09;&#xff0c;可以采样来自于外部输入通道、内部输入通道的模拟信号&#xff0c;采样转换后&#xff0c;转换结果可以按照最低有效位对齐或最高有效位对齐的方式保存在相应的数据寄存器中。 6.2.GD…

【过题记录】 7.21

Mad MAD Sum 算法&#xff1a;思维&#xff0c;前缀最大值 模拟一下他的运行过程就会发现&#xff0c;两次之后整个数组就固定了&#xff0c;之后每次都是每个数往后移动一位&#xff0c;可以模拟两次之后计算每个数的存活轮数&#xff0c;计算贡献。 #include<bits/stdc.h…

PD协议芯片ECP5701兼容PD 2.0和PD 3.0(5V,9V,12V,15V,20V),支持 PD 输入多种类型无线充方案

文章目录 前言 一、TYPE-C口无线充与传统充电器的对比 1. TYPE-C口无线充的特点&#xff08;无需线材&#xff0c;更方便&#xff1b;接口定位性强&#xff0c;分明&#xff1b;兼容多个设备&#xff1b;充电速度更快&#xff1b;充电效率更高&#xff09; 2. 传统充电器的特点…

为什么 FPGA 的效率低于 ASIC?

FPGA是“可重构逻辑”器件。先制造的芯片&#xff0c;再次设计时“重新配置”。 ASIC 不需要“重新配置”。你先设计&#xff0c;把它交给代工厂&#xff0c;然后制造芯片。 现在让我们看看这些芯片的结构是什么样的&#xff0c;以及它们的不同之处。 ● 逻辑单元&#xff1a;F…

神经网络理论(机器学习)

motivation 如果逻辑回归的特征有很多&#xff0c;会造出现一些列问题&#xff0c;比如&#xff1a; 线性假设的限制&#xff1a; 逻辑回归是基于线性假设的分类模型&#xff0c;即认为特征与输出之间的关系是线性的。如果特征非常多或者特征与输出之间的关系是非线性的&#…

【Linux】线程——线程池、线程池的实现、线程安全的线程池、单例模式的概念、饿汉和懒汉模式、互斥锁、条件变量、信号量、自旋锁、读写锁

文章目录 Linux线程7. 线程池7.1 线程池介绍7.2 线程池的实现7.3 线程安全的线程池7.3.1 单例模式的概念7.3.2 饿汉和懒汉模式 8. 常见锁使用汇总8.1 互斥锁&#xff08;Mutex&#xff09;8.2 条件变量&#xff08;Condition Variable&#xff09;8.3 信号量&#xff08;Semaph…

探索 GPT-4o mini:成本效益与创新的双重驱动

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

79页PDF免费下载 | 全域数字化转型评估模型研究报告

一、前言&#xff1a; 随着数字技术的飞速发展&#xff0c;零售行业正站在转型的十字路口。如何在变革中找到方向&#xff0c;如何通过数字化转型提升企业竞争力&#xff0c;已成为每个零售企业必须面对的课题。腾讯智慧零售与伏羲智库深度合作&#xff0c;推出《2024年全域数…

05-用户画像+mysql-hive数据导入

将用户数据导入数仓 新建 create_hive_table.sh文件 在终端执行以下文件 sh create_hive_table.sh sqoop create-hive-table \ --connect jdbc:mysql://up01:3306/tags_dat \ tags_dat库名 --username root \ root 用户名 --password 123456 \ 123456 密码 --ta…

前端练习<HtmlCSS>——悬浮抽卡片(附完整代码及实现效果)

这个小练习来源于b站up小K师兄&#xff0c;大家可以通过下面的链接学习哦~up讲的非常详细。 写一个好玩的悬浮抽卡片效果&#xff5e; 先看一下效果&#xff1a; 1.鼠标没有放置到card上 2.鼠标放到card上&#xff0c;所有card呈角度散开 3.单击选中某一张卡片&#xff0c;…

vue2 使用代码编辑器插件 vue-codemirror

vue 使用代码编辑器插件 vue-codemirror 之前用过一次&#xff0c;当时用的一知半解的&#xff0c;所以也没有成文&#xff0c;前几天又因为项目有需求&#xff0c;所以说有用了一次&#xff0c;当然&#xff0c;依旧是一知半解&#xff0c;但是还是稍微写一下子吧&#xff01;…

vue2使用univerjs

1、univerjs Univer 提供了一个全面的企业级文档与数据协同的解决方案&#xff0c;支持电子表格、文本文档和演示幻灯片三大核心文档类型。通过灵活的 API 和插件机制&#xff0c;开发者可以在 Univer 的基础上进行个性化功能的定制和扩展&#xff0c;以适应不同用户在不同场景…

提升网站性能:ThinkPHP6中如何实现Mysql分页查询

随着互联网的快速发展&#xff0c;web应用程序的开发也越来越复杂。而分页查询是web应用程序中常见的功能之一。thinkphp6是一个web框架&#xff0c;可以帮助开发人员快速开发应用程序。在本文中&#xff0c;我们将讨论如何在thinkphp6中使用mysql进行分页查询。 首先&#xf…