iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++详细讲解print缓冲区的刷新
  • 297
分享到

C++详细讲解print缓冲区的刷新

2024-04-02 19:04:59 297人浏览 泡泡鱼
摘要

目录printf缓冲区问题一.引入二.深入理解printfprintf缓冲区问题 以下内容在linux测试,Window中进行试验时现象可能会有不同。 一.引入 对于printf输出

printf缓冲区问题

以下内容在linux测试,Window中进行试验时现象可能会有不同。

一.引入

对于printf输出函数具有缓冲区,是在使用sleep函数测试时发现的。

首先把测试问题复述一下:

简单写一个hello world的程序

#include <stdio.h>
int main()
{
    printf("hello world\n");
    sleep(5);  //延迟5秒
     printf("hello friend\n");
    return 0;
}

输出结果:

hello world 和hello friend的输出中间间隔了5秒

当我们修改一下代码后:将hello world后的\n换行符删掉后

#include <stdio.h>
int main()
{
    printf("hello world");
    sleep(5);  //延迟5秒
     printf("hello friend\n");
    return 0;
}

输出结果:

这个输出结果是: 光标先闪烁5s然后弹出hello worldhello friend

这里我们发现就会发现:当我们删除字符‘\n’,函数sleep不再是语句间延迟,而是变成延迟整个程序。

这里出现的结果就很诧异 原来就一直没注意过也没有想过会存在这个问题 ,下面就深入理解一下printf。

二.深入理解printf

printf是一个行缓冲函数,并不会直接将数据输出到屏幕,而是先放到缓冲区中,满足一定的条件后,才会将缓冲区内容输出。

设置缓冲区是为提高IO速度,减少CUP等待IO而浪费CPU资源。

如下5个条件可以刷新缓冲区:

  1. 缓冲区写满
  2. 写入的字符中有‘\n’ , ‘\r’
  3. 调用fflush手动刷新缓冲区
  4. 调用scanf要从缓冲区中读取数据时,也会将缓冲区内的数据刷新
  5. 程序结束时

1. 缓冲区写满

printf函数的缓冲区大小为1024个字节,当超出缓冲区的大小,缓冲区会被刷新,将会打印出结果。

缓冲区大小为1024个字节,这个大小是这样得出,代码如下:

 #include <stdio.h>
 #include <stdlib.h>
 
 int main(int arGC, char **argv){ 
     int i;
     char a='a';
     if(argc != 2) //命令行参数为2,否则出错
     {
         printf("Usage:%s Number\n",argv[0]); 
         return 0;
     }
     for(i=0;i<atoi(argv[1]);i++) //atoi:字符转化为整数
     {
         printf("%c",a);
     }
     while(1);  //让程序一直运行
 }

运行结果:

说明:在linux下,printf缓冲区大小为1024字节。while(1)使程序一直运行,当缓冲区未满时,不会输出打印。

2. 写入的字符中有‘\n’,‘\r’

测试代码:

#include <stdio.h>
int main()
{
    printf("hello world\n");//
    sleep(5);  //延迟5秒
     printf("hello friend\n");
    return 0;
}

运行结果:

3. 调用fflush手动刷新缓冲区

测试代码:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main(void)
{
    printf("hello world");
    fflush(stdout);
    sleep(5);
    exit(0);
}

运行过程及结果:

这里在printf语句结束后,使用fflush强制刷新缓冲区,就先打印出来内容,再执行的 sleep语句。

4. 调用scanf要从缓冲区中读取数据时,也会将缓冲区内的数据刷新

这个我们可以理解为当我们从键盘输入的时候,就会将数据内的数据自动刷新。

5. 程序结束时

测试代码:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main(void)
{
    printf("hello world");
    sleep(5);
    exit(0);
}

运行结果:

到此这篇关于c++详细讲解print缓冲区的刷新的文章就介绍到这了,更多相关C++ print缓冲区内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++详细讲解print缓冲区的刷新

本文链接: https://www.lsjlt.com/news/149356.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++详细讲解print缓冲区的刷新
    目录printf缓冲区问题一.引入二.深入理解printfprintf缓冲区问题 以下内容在Linux测试,Window中进行试验时现象可能会有不同。 一.引入 对于printf输出...
    99+
    2024-04-02
  • C++怎么实现print缓冲区的刷新
    这篇文章主要讲解了“C++怎么实现print缓冲区的刷新”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++怎么实现print缓冲区的刷新”吧!printf缓冲区问题以下内容在Linux测试...
    99+
    2023-06-30
  • C++缓冲区刷新的方法是什么
    在C++中,可以使用以下方法刷新缓冲区: 使用std::endl:在输出流中使用std::endl会自动刷新缓冲区,并插入一个换行...
    99+
    2023-10-23
    C++
  • node.js缓冲区buffer的详细介绍
    这篇文章主要介绍“node.js缓冲区buffer的详细介绍”,在日常操作中,相信很多人在node.js缓冲区buffer的详细介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2024-04-02
  • 详细聊聊c语言中的缓冲区问题
    目录发现问题例题问题原因解决方法一:解决方法二:解决方案三:出错二gets函数引入为什么要引入缓冲区总结发现问题 你是不是总会出现当你输入的时候(你想的是只输出一个内容),但是最后却...
    99+
    2024-04-02
  • 详解C语言之缓冲区溢出
    目录一、缓冲区溢出原理二、缓冲区溢出实例三、缓冲区溢出防范3.1、gets3.2、strcpy3.3、 strncpy/strncat3.4、sprintf3.5、scanf3.6、...
    99+
    2024-04-02
  • C++字符串输入缓冲区机制详解
    目录一、缓冲定义1.缓冲定义 2.为什么引入缓冲区 二、scanf,cin输入缓冲区1.scanf和cin的缓冲类型 2.scanf和cin的缓冲机制 3.cin.getline和c...
    99+
    2024-04-02
  • SpringBoot详细讲解如何创建及刷新Spring容器bean
    目录一、前期准备1.1 创建工程1.2 创建Controller二、探究过程2.1 启动类2.2 SpringApplication2.3 ApplicationContextFac...
    99+
    2024-04-02
  • java15新功能的详细讲解
    目录1. JEP 339 爱德华曲线算法(EdDSA)2. JEP 360:Sealed Classes(密封类)预览3. JEP 371:Hidden Classes(隐藏类)4....
    99+
    2024-04-02
  • C++详细讲解图的遍历
    目录图的遍历图的深度优先遍历(DFS, depth first search)图的宽度优先遍历(BFS, breadth first search)宽度优先搜索BFS的应用深度优先遍...
    99+
    2024-04-02
  • C++详细讲解对象的构造
    目录一、对象的构造(上)1.1 对象的初始值1.2 对象的初始化1.3 小结二、对象的构造(中)2.1 构造函数2.2小实例2.3 小结三、对象的构造(下)3.1 特殊的构造函数3....
    99+
    2024-04-02
  • C++ Cartographer的入口nodemain详细讲解
    目录Run函数读取配置参数构建地图构建器Node类的初始化开始轨迹与结束轨迹啃一下谷歌优秀的激光SLAM开源框架-Cartographer. 这个框架算法简单,但是程序部分太多需要学...
    99+
    2023-03-19
    C++ node main C++ Cartographer
  • C++详细讲解函数调用与Struct和CLass的区别
    目录一、结构回顾1、传值调用2、引用调用3、指针调用二、public和private权限修饰符三、类简介四、类的组织一、结构回顾 结构:自定义的数据类型,不管C++/C结构都用Str...
    99+
    2024-04-02
  • C++OOP对象和类的详细讲解
    目录C++OOP对象和类1.预备知识2.抽象和类2.1 数据抽象2.2 类2.3 接口3.C++中的类和对象3.1 C++类的定义3.2 C++对象的定义3.3 C++访问数据成员3...
    99+
    2024-04-02
  • C++运算符重载的详细讲解
    加号运算符重载 对于内置数据类型,编译器知道如何运算 但是对于自己封装的类,编译器无法进行运算 这时可以通过自己定义运算符重载进行运算 operator+ 通过成员函数重载+号 ...
    99+
    2024-04-02
  • c++智能指针的超详细讲解
    目录1.什么是智能指针2.原始指针的问题3.unique_ptr4.shared_ptr5.shared_ptr使用需要注意的点5.1 不能将一个原始指针初始化多个shared_pt...
    99+
    2024-04-02
  • C++超详细讲解友元的使用
    目录一、友元的概念二、友元的用法三、友元的语法四、友元的尴尬五、注意事项六、小结一、友元的概念 什么是友元友元是 C++ 中的一种关系友元关系发生在函数与类之间或者类与类之间友元关系...
    99+
    2024-04-02
  • C语言详细讲解const的用法
    目录一、int const a / const int a二、const int(*p)/int const(*p)三、int*const p四、const用于函数的地址传递参数一、...
    99+
    2024-04-02
  • C++详细讲解图的拓扑排序
    目录一、前言二、算法流程三、有向图的拓扑排序一、前言 且该序列必须满足下面两个条件: 每个顶点出现且只出现一次。若存在一条从顶点 x到顶点 y的路径,那么在序列中顶点 x 出现在顶点...
    99+
    2024-04-02
  • 超级详细讲解C++中的多态
    目录多态概念引入1、C++中多态的实现1.1 多态的构成条件1.2 虚函数1.3虚函数的重写1.4 C++11 override && final1.5 重载,覆盖(...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作