编写进度条小程序以及所需知识点

目录

sleep(n)函数

输出缓冲区

fflush(stdout)

回车和换行表示的含义是完全不同的

\r 回车

\r 的注意事项

\n 换行

进度条打印代码


sleep(n)函数

在头文件中。用于让程序暂停n秒。

 编写进度条小程序以及所需知识点_第1张图片

上图中,两个main函数的区别只有printf()函数中有无\n换行符。但运行结果却截然不同。带\n的程序将立刻打印hello Linux,然后休眠3秒后结束程序,而不带\n的程序将休眠3秒,然后程序结束后才能打印hello Linux。为什么会这样呢?

答案是:因为有输出缓冲区的存在,而输出缓冲区又有特定的刷新策略将数据刷新到显示器上。

输出缓冲区

由于我们知道,程序一定是从上到下执行的,所以不带\n的情况,printf函数也一定是先执行的,只是没有立刻将打印结果显示到屏幕上,而是休眠了3秒,等进程结束前的一瞬间才显示,然后进程结束。这里就要引出一个知识点叫输出缓冲区。C语言是会为我们提供输出缓冲区的,什么意思呢?上图代码是用C语言编写的,因为语言本质上就是用来操作计算机硬件的,所以这里C语言可以用来操作内存,输出缓冲区就是这块内存的名字,这块输出缓冲区会根据特定的刷新策略,进行刷新。比如说:内存对于显示器设备采用的策略一般是行刷新,只有遇到\n换行符才会把\n之前的数据全部刷新到显示器设备上,注意遇到空格是不会的。(这里的输出缓冲区也可以认为他是行缓冲区)

fflush(stdout)

本质上和\n的区别就只是不用换行,都是将输出缓冲区的内容刷新到标准输出上,即显示器。

如果printf函数不带\n换行符,还想立刻刷新到显示器上,在printf函数后添加 fflush(stdout)即可。如下图:

编写进度条小程序以及所需知识点_第2张图片

回车和换行表示的含义是完全不同的

编写进度条小程序以及所需知识点_第3张图片

编写进度条小程序以及所需知识点_第4张图片

\r 回车

1. \r 回车并不会换行,回车表示回到当前行的行首,如上图回车用\r表示。注意在printf这样的输出函数中用\r回车符,并且是连续输出,后来输出的内容会将之前的内容原地覆盖掉,这也解释了一些动态效果是如何实现的,如倒计时,或者旋转,这里用旋转举例。假设最初是 | ,后来输出 \ 并将 | 覆盖,后来又输出 / \ 覆盖掉。

\r 的注意事项

\r 已经中招两次了,比如上两张图倒计时的视觉效果,比如从5倒计时到1,最后屏幕上应该留有“正在倒计时1”这样的文本,但程序运行结束后却发现没有,文本好像消失了,是真的消失了吗?其实没有消失,只是因为 \r不会换行,导致让用户输入指令的提示符部分即上两张图红框部分挡住了 “正在倒计时1”这个文本。两次中招,花费大量时间去脑部 /r的作用,真是快气死了。

\n 换行

2. \n 换行并不会回到行首,而只表示换行而已,如上图换行用\n表示。那肯定有人会疑惑了,我们平时写代码用pritnf函数时,加了\n后打印出来的结果为什么会回到行首再换行呢?这是因为不同操作系统的编码规则不一样,Windows系统下的大多数编译器会把 \n 编译成 \n\r 。所以不同操作系统的代码相互拷贝,有时会造成换行失败。

进度条打印代码

如下图:

1. char*c1是用来制造旋转的视觉效果的,有些场景会需要这种效果,如下载文件时,文件过大,导致进度缓慢,进度一直在比如66%,如果不存在旋转或者其他视觉效果时,可能会让用户认为卡机了,所以需要制造一个无论何时都会发生视觉变化的效果,如下面的旋转。c1中有 \\ ,也是为了转义。

2. 在Linux中sleep是以秒为单位,太慢了,所以下面使用了usleep,以微秒为单位,1000微秒等于1毫秒,10000微妙等于10毫秒,等于0.01秒。

编写进度条小程序以及所需知识点_第5张图片

你可能感兴趣的:(Linux,linux,运维,服务器)