文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【Linux】从0到1实现一个进度条小程序

2023-08-16 14:11

关注

在这里插入图片描述
在这里插入图片描述

个人主页:🍝在肯德基吃麻辣烫
我的gitee:gitee仓库
分享一句喜欢的话:热烈的火焰,冰封在最沉默的火山深处


进度条实现:

在这里插入图片描述


本文讲解如何从0到1实现一个进度条小程序。


我们在写作文的时候,写到了一行的结尾,就得另起一行并到开头继续写。在这里插入图片描述

其中,这个另起一行的动作就是"换行"
回到开头的动作就是"回车"

但是,\n其实包含了回车和换行两个动作。
我们的键盘上面的回车键也是同时包含回车和换行两个动作。


1. 认识第一个函数:sleep

sleep(1);

sleep函数的功能是让计算机等待指定秒数(单位:秒)后再继续启动。
知道sleep的功能即可。

还有一个睡眠函数:usleep,它们的功能相同,只不过这个函数的单位是微秒

1秒 = 1000毫秒
1毫秒= 1000微秒

2.观察缓冲区出现的现象

来看第一段代码出现的现象:

  2 #include "process.h"  3   4 int main()  5 {  6     printf("Hello Linux\n");  7     sleep(2);  8   9     return 0; 10 }        

现象:

在这里插入图片描述
第二段代码:

  2 #include "process.h"  3   4 int main()  5 {  6     printf("Hello Linux");  7     sleep(2);          8   9     return 0; 10 }

现象:

在这里插入图片描述

通过这两段代码以及出现的现象可知:

问:第一个现象是先执行printf函数还是先执行sleep函数?

实际上,c语言是从上往下扫描代码的,所以一定是先执行printf函数。那么,在sleep两秒期间,printf函数去哪了呢?

一定是被保存起来了。

这个保存的东西,就叫做缓冲区

在c语言有一块内存叫做缓冲区

缓冲区是由c语言维护的一块内存空间。

到这里就可以解答第一个现象了,首先执行printf函数,输出Hello Linux,先保存到缓冲区中,2秒后再输出到显示器文件中,由于没有换行,后面则紧跟着指令条。

为什么第二个现象是马上就输出Hello Linux,再睡眠两秒呢?

这是因为'\n'这个换行符,具有刷新缓冲区的功能。

也就是把缓冲区里面的东西给刷掉,让它走它该走的地方,别停留在缓冲区里面了。

至此我们可以解释第二个现象了:Hello Linux字符串其实是先保存到缓冲区中的,然而

遇到'\n'这个换行符刷新后,将该字符串输出到了显示器文件中,再执行2秒休眠,这

才是我们看到的东西。

3. 认识第二个函数:fflush

在c程序中会默认打开三个流:标准输入流,标准输出流,标准错误流。
这里只考虑标准输出流,该流的默认数据是stdout,也就是显示器文件。

fflush函数的功能是:将缓冲区的内容写入到标准输出流。
通俗一点就是将缓冲区的内容打印到屏幕上。

有了这个函数,接下来我们就可以实现进度条小程序了。

了解倒计时

要实现进度条,首先要知道它每一步要输出什么。
首先讲一讲倒计时,我们见过的倒计时是这样的:
在这里插入图片描述
这里有一个需要注意的地方:

就用到开头讲到的'\r'回车符,每次输出数字后,将光标回到当前行开头,再输出,就能将上一个数字覆盖。

具体代码如下:

  2 #include "process.h"  3   4 int main()  5 {  6     int cnt = 9;  7     while(cnt)  8     {  9        printf("%d\r",cnt--); 10        fflush(stdout);11        sleep(1); 12     } 13     return 0; 14 }~

效果如下:

在这里插入图片描述

准备工作

知道倒计时怎么走后,我们的进度条的过程是类似的:
在这里插入图片描述
输出的过程如上,只是每一次都把数据+1,并输出在当前行,达到一个慢慢增加的效果。(这里为了演示过程,实际上每次输出数据都是输出在同一行)

到此,贴出代码,就可以实现进度条啦!

process.h文件

  1        2 #include                          3 #include                         4 #include             5                        6 void process();   

process.c文件

  1  #include"process.h"   2 #define SIZE 102  3 #define BODY '='  4 #define HEAD '>'  5                   6 char bar[SIZE];   7 const char* lable = "|\\-/";  8   9 void process()               10 {              11     int cnt = 0; 12     memset(bar,'\0',sizeof(bar)); 13     char c = HEAD;                14     while(cnt<100)                15     {              16         int len = strlen(lable); 17         bar[cnt++] = BODY;       18         if(cnt < 100)            19              bar[cnt] = c; 20         printf("[%-100s][%d%%][%c]\r",bar,cnt,lable[cnt%len]); 21         fflush(stdout);            22         usleep(100000);            23                         24     }                   25     printf("\n"); 26 }    

main.c文件

  1   2 #include "process.h"  3   4 int main()  5 {  6     process();         7     return 0;  8 }

一个进度条就新鲜出炉啦!


今天的文章讲了如何在Linux上实现一个进度条小程序,做这个进度条小程序的核心是理解’\r’和’\n’两个转义字符,以及缓冲区的概念,理解之后,实现起来就不难啦。

来源地址:https://blog.csdn.net/w2915w/article/details/132030481

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-人工智能
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯