Linux——\r,\n和缓冲区

\r,\n和缓冲区

C语言中有很多字符

a、可显字符

b、控制字符

\r 回车,\n 换行

当我们打印数据时只加了\n,代码则是正常打印

如果换成\r,则不能正常打印

假如说加个刷新函数

但是还是不行,没打印

而且加上休眠函数也是不能打印

先来看看休眠函数

要是我们把\n去掉了光标就还会在Hello World 那一行后面紧跟着就是命令行

而且在sleep休眠时间长一点的时候,程序似乎是先进行休眠如然后在打印hello world的

但其实并不是这样,代码是从上到下按顺序执行的,一定是先执行完printf再去执行sleep的

只不过在sleep期间,这个hello world没有被刷新,数据一定是在sleep期间被保存起来了

但外什么使用\n就能打印出来呢?

因为缓冲区有自己的刷新策略

行缓冲:只要系统碰到了换行符,那么就会把换行符之前的内容全部刷新出来

这里如果在sleep前面加个刷新函数

运行时发现hello world短暂的出现了几秒,然后就被命令行覆盖了,而且还能发现打印后的光标时在最左边的

要是什么都不带,让系统强制性的去刷新

命令行就会在光标的位置出现

根据这个原理,就可以做一个简单的倒计时程序

那么要是把\n换成\r,是不是每次打印时数字都会覆盖原来的数字,那就只会在一行打印倒计时?

但是结果却不尽人意,什么都没有打印

这是因为数据被放在了缓冲区里了,没有刷新,数据就显示不出来

加上一个刷新函数就能打印出来了,最后的那个\n是为了让命令行不去覆盖倒计时数字

但是倒计时如果是从10开始那就还是有点问题

首先我们要了解,凡是向显示器打印的所有内容,都是字符,pintf函数打印时也是先将内容转换成字符串,最后在一个一个打印出来,我们再看看上面的代码运行结果,能发现效果并不尽人意

其实将输出改成%2d就行了

练习:进度条

可以用刚刚的知识写一个简易的进度条

创建这三个文件,试着实现一下进度条

.h包含方法的声明

.c里包含方法的实现

这时的makefile要依赖两个源文件

现在来写一下代码实现

先定义一个数值在再将他们全初始化成0

进度条主要是用#来进行填充

先来试一下效果,确实能打印,但是并不是再一行内打印,将\n换成\r就可以变成在一行打印了,有了sleep才能以合适再加上刷新就能让存在缓冲区里的数据显示出来

确实可以了,但还可以再优化一下,让右括号固定一下吧,不要随着#增加而移动;

然后底下还有个优化,让休眠时间短一点

但是,好像反了(╯▽╰)

其实给100前面加个负号就行了

这下就可以了

还可以再优化的好看一点 ,给进度条右边加百分比,再加个箭头,这样直观一点

这样看起来顺眼多了

如果还想优化的话还可以加个加载动画

至于代码,\\意思就是\,因为\符号比较特殊,同理,之前写的%%也是这个意思,i%4就能在 0,1,2,3里面循环

而且C语言里还能还能改变输出的颜色,我们也可以给进度条换一个颜色

\033是设置打印出来的结果的所有格式的,后面的是具体要用到的指令

确实变色了

而且还能设置背景颜色,但是这里就不深究了

相关推荐
mifengxing1 小时前
文件逻辑结构、物理结构与磁盘空闲存储空间管理
大数据·linux·运维·操作系统·计算机408
xcLeigh1 小时前
Go入门:无类型常量与类型常量的区别
服务器·开发语言·golang
小此方2 小时前
Re:Linux系统篇(五十七)线程篇 · 十:基于环形缓冲的生产者消费者模型与信号量
linux·运维·驱动开发
fanged3 小时前
Linux的DD命令
linux·运维·服务器
华清远见成都中心4 小时前
FreeRTOS事件组(Event Group)的工作机制分析
服务器·网络·网络协议
xiaoxiangsiyan4 小时前
RHCE2026云原生路线EX188和EX288完整备考指南
运维·网络·云原生·自动化
九硕智慧建筑一体化厂家4 小时前
从照明节能到碳排可见:能碳平台助力机房迈向 “零碳” 未来
运维·笔记·智慧城市
张洛闻Eren4 小时前
MySQL 管理复制拓扑【MySQL第四课】
linux·运维·数据库·mysql
Meya11274 小时前
RFID 机房资产管理系统:告别手工台账,实现资产全流程自动管控
大数据·服务器
西安景驰电子4 小时前
《PTP精确时间协议系列》第二篇:工程部署、调试与性能优化
运维·服务器·网络·数据库·windows·性能优化