printf缓冲区刷新问题

简介: printf缓冲区刷新问题

以下内容在Linux测试,Window因为没遵循POSIX,所以现象会有不同。

一、前言

首先,printf缓冲区的问题,平时不大会发现,当时是在使用sleep函数时出现的。先来看一下问题。

#include <stdio.h>

int main()
{
    printf("hello\n");
    sleep(1);  //延迟1秒
    printf("world\n");
    return 0;
}

上面的代码正常输出:
hello
world
两个之间间隔一秒输出

接下来做一下修改:

#include <stdio.h>

int main()
{
    printf("hello"); /*去掉转义字符'\n'*/
    sleep(1);
    printf("world\n");
    return 0;
}

上面的代码输出为:
helloworld
但是输出却是延迟一秒之后才将helloworld一起输出

当我们去掉转义字符‘\n’,延迟函数sleep不再在语句间延迟,而是变成延迟整个程序。

二、深入理解printf

printf是一个行缓冲函数,先写到缓冲区,满足一定的条件后,才会将缓冲区内容输出到对应文件中,如下几个条件可以刷新缓冲区:

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

接下来我们修改一下程序

include <stdio.h>

int main()
{
    printf("hello");
    fflush(stdout);   //强制刷新缓存,输出显示
    sleep(1);
    printf("world\n");

    return 0;
}

这个时候的效果就是先输出hello,然后1秒之后再输出world。

相关文章
|
存储 算法 编译器
C/C++编译器局部优化技术:局部优化是针对单个函数或基本块进行的优化
C/C++编译器局部优化技术:局部优化是针对单个函数或基本块进行的优化
434 0
|
缓存 JSON 安全
43 Swift中的一些第三方库
Swift中的一些第三方库
423 0
|
5月前
|
机器学习/深度学习 人工智能 算法
人机融合智能 | “人智交互”跨学科新领域
本文围绕“以人为中心AI(HCAI)”理念,提出人-人工智能交互(人智交互)这一跨学科领域及框架。文章定义了人智交互的基本理论、关键问题与方法,并探讨其开发流程和团队协作模式,强调该领域的研究意义。文中分析了智能时代人机交互的新特征,提出“人智组队”的新型人机关系,指出智能系统可作为“辅助工具+合作队友”存在。同时,文章通过对比AI学科与人因科学的优势与不足,阐明跨学科合作的必要性,为未来人智交互研究提供方向。本章旨在为后续内容构建基于HCAI理念的研究与应用框架。
498 0
|
9月前
|
监控 数据挖掘 API
唯品会商品列表接口(唯品会 API 系列)
唯品会商品列表接口助力电商数据分析、竞品调研和价格监控。开发者可通过合法途径获取接口权限,使用HTTP GET/POST请求获取商品名称、价格等信息,返回JSON格式数据。Python示例代码展示如何调用接口并解析返回数据。应用场景涵盖市场调研、价格监控、数据挖掘与分析及电商运营优化,为企业决策提供有力支持。
|
运维 监控 数据中心
100Base-FX以太网媒体标准详解
【10月更文挑战第16天】
1058 1
|
搜索推荐
专注力差影响工作效率?这5款办公软件让你事半功倍
本文介绍了5款提高专注力的办公软件:板栗看板、Forest、Focus@Will、RescueTime和Cold Turkey。这些工具通过任务管理、时间追踪、音乐辅助等方式,帮助用户减少干扰,提高工作效率。板栗看板适合任务管理,Forest通过“种树”机制培养专注习惯,Focus@Will提供科学背景音乐,RescueTime追踪时间使用,Cold Turkey则强力屏蔽干扰。选择合适的工具,结合有效的方法,可显著提升职场人士的工作专注度和生产力。
专注力差影响工作效率?这5款办公软件让你事半功倍
|
NoSQL Linux Redis
redis源码调试---vscode使用技巧-----C语言跳转到函数定义
redis源码调试---vscode使用技巧-----C语言跳转到函数定义
444 0
|
存储 大数据 Linux
文件系统EXT3,EXT4和XFS的区别
通过上述分析,我们可以看出,选择哪种文件系统需依据具体的应用需求而定,无论是寻求稳定性与兼容性的EXT3,追求高性能与扩展性的EXT4,还是面向大数据处理优化的XFS,各有千秋。正确评估业务需求,方能做出最适合的选择。
1081 2
|
算法 安全 调度
操作系统中的死锁、饥饿和优先级反转
【8月更文挑战第23天】
579 0
|
存储 数据挖掘 Linux
Linux命令split详解:大文件处理的得力助手
`split`命令是Linux用于将大文件分割成小文件的工具,常用于日志处理、备份。它支持按行数(-l)、字节数(-b)分割,并能自定义输出文件名(-a, -d)。例如,`split -b 10M largefile.txt smallfile_`会按10MB切割`largefile.txt`,生成`smallfile_`开头的文件。注意确保磁盘空间充足,避免文件名冲突,并备份原始文件。结合其他命令使用,能提高文件管理效率。