【Linux】-第一个小程序(进度条)

这篇具有很好参考价值的文章主要介绍了【Linux】-第一个小程序(进度条)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

💖作者:小树苗渴望变成参天大树
🎉作者宣言:认真写好每一篇博客
🎊作者gitee:gitee
💞作者专栏:C语言,数据结构初阶,Linux,C++ 动态规划算法
【Linux】-第一个小程序(进度条),Linux,linux,小程序,运维

如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧!


前言

大家好久不见,已经快一个月没有更新Linux相关的知识了,希望大家还没有忘记前面学过的知识,不记得可以看看我前面写的博客,可以快速帮大家进行回忆,今天我们讲讲一个新的知识,把我们前面说到的make进行联系起来,再讲小程序进度条之前,我还有两个知识铺垫,不然大家不好理解,话不多说,我们开始进入正文


一、知识铺垫

再讲解进度条之前,我们必须了解这两个概念,一个是回车换行,一个是行缓冲区

1.1回车换行

对于回车换行其实是两个概念,一个是回车,一个是换行,换行是光标换到下一行,并不会到文本的开头,回车使光标回到当前行的开始,那在我们语言的层面是怎么做到对文本进行换行和回车的,我们平时说到 \n其实就是换行的意思的,但是语言的本身把他解释成回车换行,\r是回车的意思的,回车换行其实就是先换行再进行回车,我们来看看老式的键盘
【Linux】-第一个小程序(进度条),Linux,linux,小程序,运维
这个标志就很形象,为什么要讲解这个知识点,原因是为了更好的引出下面这个要铺垫的知识点

1.2行缓冲区

再我们的C语言中,我们要行缓冲区,这是个什么,为什么要有这个,再我们运行程序的时候,我们会在屏幕上看到显示的内容,这些都是由字符组成的,那我们的C语言不是一个字符一个字符的显示再屏幕上,这样觉得消耗太大了,所以我们有了行缓冲区的概念,就是程序运行时的一块内存,把数据先放到这个内存里面,等到这个小内存满了,就直接一起全部给刷新出来,为什么又叫行缓冲区,就是当一行满了,就一起刷新出来,只有遇到\n或者scanf或者fflush这样的函数就会提前进行刷新,程序结束后,最终也会将数据进行刷新出来。

所以我们来看一个例子:

#include <stdio.h>
#include<unistd.h>
int main()
{
 printf("hello Makefile!\n");
 sleep(3);
 return 0;
}

【Linux】-第一个小程序(进度条),Linux,linux,小程序,运维
再来看这个代码:

#include <stdio.h>
#include<unistd.h>
int main()
{
 printf("hello Makefile!");//1
 sleep(3);//2
 return 0;
}

【Linux】-第一个小程序(进度条),Linux,linux,小程序,运维
大家看到这个结果大概率会认为先执行了2代码,再执行1代码,但是事实却不是这个样子的,我们C语言的代码都是自上往下进行执行的,除非遇到跳转,循环之类的,对于上面的代码的肯定是先执行的打印函数,再执行休眠函数,那为什么不是先打印出来呢??原因就是,打印的数据再缓冲区里面,然后开始执行了2代码,最后程序结束了,就会一起刷新出来,最后从显示出来。

我们想必须提前刷新出来,还有一种方法就是使用fflush函数,我们查看一下手册【Linux】-第一个小程序(进度条),Linux,linux,小程序,运维
再我们c语言会默认打开三个流,这个再C语言专栏的文件操作讲过,一个是输入流stdin,一个是输出流stdout,一个是错误流stderr,而fflush的参数就是传流进出,这里是将数据输出,所以使用输出流

代码修改:

#include <stdio.h>
#include<unistd.h>
int main()
{
 printf("hello Makefile!");
 fflush(stdout);
 sleep(3);
 return 0;
}

【Linux】-第一个小程序(进度条),Linux,linux,小程序,运维
大家看到达到我们想要的效果了吧。

1.3倒计时

结合上面讲的两个知识点,进行编写一个倒计时。

  1 #include"processBar.h"
  2 int main()
  3 
  4 {
  5     int cnt=9;
  6     while(cnt>=0)
  7     {
  8         printf("%d",cnt);
  9         fflush(stdout); //不加会显示不出来,最后会一起显示出来                                                                                                                                               
 10         sleep(1);
 11         cnt--;
 12     }
 13     return 0;
 14 }

不加:
【Linux】-第一个小程序(进度条),Linux,linux,小程序,运维
加:
【Linux】-第一个小程序(进度条),Linux,linux,小程序,运维

显然这两种都不是我们想要的倒计时,我们看看有一个特点,我们每输出一个时间光标就往后面跑一个字符,所以想要把之前的字符覆盖,就要是光标一直再开头的位置,所以我们再打印的时候加一个 \r

+\r
【Linux】-第一个小程序(进度条),Linux,linux,小程序,运维
这才是我们想要的倒计时,但是这个程序还有一个小毛病,但从大于9开始倒计时就会出现问题,我们需要进行打印格式的调整

会出现下面的情况:

【Linux】-第一个小程序(进度条),Linux,linux,小程序,运维
解决方法:(以%-2d的形式进行打印就可以了)
【Linux】-第一个小程序(进度条),Linux,linux,小程序,运维

到这里我们的知识铺垫到此结束,接下来开始正式讲解进度条的实现

二、进度条

我们最终是要将我们的进度条模拟实现成多软件一起下载的场景,如下:
【Linux】-第一个小程序(进度条),Linux,linux,小程序,运维

此次进度条的模拟实现,我打算使用多文件的方式,使用自动化构建来编写,我们开始做一些前期工作【Linux】-第一个小程序(进度条),Linux,linux,小程序,运维
我们准备工作做好之后,我们开始来实现进度条代码吧

2.1基础进度条

设计思想: 在实现对多软件的模拟进度条下载,我们必须先弄清楚一个普通的进度条是怎么实现的吧。我们就需要使用到\r的特性,\r是回车的意思,将光标回到当前行开始的地方,我们采取的是先打印一个字符,然后再增加一个字符进行覆盖打印,如果是换行打印,就类似于一个直角三角形,我们来看代码实例:

  1. 错误示范
    【Linux】-第一个小程序(进度条),Linux,linux,小程序,运维
    这个显然不是我们想要的效果,我们达到我们想要的推进式打印,但是想要打印在同一行,这时候就需要使用\r使光标变到第一行,然后一次一次的覆盖打印,但是要记得刷新。

  2. 正确操作
    【Linux】-第一个小程序(进度条),Linux,linux,小程序,运维
    这个就符合我们想要的进度条了,但是这个进度条和我们一开始想要的还是有差别

  3. 将进度条放在一个框框里面,并且显示进度,这个需要了解C语言的打印格式,C语言默认是右对齐,我们想要每次打印从左往右,就需要采取左对齐,再框框里面预留100个位置,因为一次是增加一个字符,我们来看代码:
    【Linux】-第一个小程序(进度条),Linux,linux,小程序,运维

  4. 等待旋转标志
    这个是告诉用户进度条再运行,给个提示,使用字符 **|/-\**循环打印来模拟实现再旋转的场景,看代码:
    【Linux】-第一个小程序(进度条),Linux,linux,小程序,运维
    我们的第一代进度条就算是完成了,我们再来完善一下,使他变得可控一些
    【Linux】-第一个小程序(进度条),Linux,linux,小程序,运维
    代码:

  1 #include"processbar.h"
  2 void processbar()
  3 {
  4     char bar[NUM]={0};
  5     int cnt=0;
  6     const char*label="|/-\\";
  7     int len=strlen(label);
  8     while(cnt<=100)
  9     {
 10         printf("[%-100s][%d%%][%c]\r",bar,cnt,label[cnt%len]);
 11         fflush(stdout);
 12         usleep(50000);//控制进度条的时间                                                                                                                               
 13         bar[cnt++]=STYLE;
 14     }
 15     printf("\n");
 16 }

2.2进阶进度条

我们要是想完成这个进阶进度条,就不能把循环放进一个函数里面,这样是不可控的,我们要专门写一个下载函数,来进行软件的下载,把下载的进度单独设置成一个函数,什么叫下载的进度,下面这就叫下载的进度

【Linux】-第一个小程序(进度条),Linux,linux,小程序,运维
我们来修改代码:

 1 #include"processbar.h"
  2 
  3 //下载函数
  4 void download(int tatol,int internetspeep)//传软件总大小和下载速度
  5 {
  6     initbar();
  7     int cur=0;//从0MB开始下载
  8     while(cur<=tatol)
  9     {
 10         processbar(cur*100/tatol,tatol,internetspeep);//乘100是因为传进去里面有百分比,传当前进度,总大小和下载速度
 11         cur+=internetspeep;//internetspeepMB/s的速度下载
 12         usleep(1000000);
 13     }
 14     printf("\n");
 15 }
 16 //进度函数
 17 char bar[NUM]={0};//设置成全局的,因为再下载函数里面要频繁调用进度函数,而进度是一直推进的,放在进度函数里面会导致调用依次之后就会被销毁
 18 void initbar()//每次任务下载的之前都要初始化一下
 19 {
 20     memset(bar,'\0',sizeof(bar));
 21 }
 22 void processbar(int rate,int tatol,int internetspeep)//传当前进度进来,就是已经下载的大小占总大小的多少
 23 {
 24     const char*label="|/-\\";
 25     int len=strlen(label);                                                                                                                                             
 26     printf("[%-100s][%d%%][%c][%s%d%s]\r",bar,rate,label[rate%len],"已经下载了",tatol*rate/100,"MB");
 27     fflush(stdout);
 28     int count=internetspeep*100/tatol;
 29     while(count--)//每次进度条增加几条字符,按照下载速度占总大小的百分比老算
 30     {
 31        bar[rate++]=STYLE;
 32     }
 33 }

【Linux】-第一个小程序(进度条),Linux,linux,小程序,运维
我们来看运行结果:
【Linux】-第一个小程序(进度条),Linux,linux,小程序,运维


这样已经很符合我们平时下载的进度条了,但是我还想再优化一下时进度条好看一些---------->这样的形式
代码优化:【Linux】-第一个小程序(进度条),Linux,linux,小程序,运维

【Linux】-第一个小程序(进度条),Linux,linux,小程序,运维
颜色优化:(https://blog.csdn.net/wuquan_1230/article/details/106077560)参考这篇博客
代码:
【Linux】-第一个小程序(进度条),Linux,linux,小程序,运维

【Linux】-第一个小程序(进度条),Linux,linux,小程序,运维
这就实现了一个非常好看的进度条

三、总结

今天大家实现了Linux上的第一个小程序,进度条,希望大家下来可以自己去实现一下,还是比较好玩的,也可以修改成自己风格的进度条,我们今天的知识就讲解到这里了,下篇再见文章来源地址https://www.toymoban.com/news/detail-520065.html

到了这里,关于【Linux】-第一个小程序(进度条)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux第一个小程序进度条

    ​ 在写进度条程序之前我们需要介绍一下缓冲区,缓冲区有两种,输入和输出缓冲区,这里主要介绍输出缓冲区。在我们用C语言写代码时,输出一些信息,实际上是先输出到输出缓冲区里,然后才输出到我们的显示器上。 原因是: 如果输出一个字符就打印到显示器上,那么

    2024年02月05日
    浏览(26)
  • 【Linux】编写第一个小程序:进度条

    1.1.1 sleep() 作用:让程序休眠指定秒数,如: sleep(3); //让程序休眠3秒 与 Windows 上的 Sleep() 函数不同 需要包含头文件 unistd.h 1.1.2 fflush() 作用:刷新缓冲区 需要传入一个流 需要包含头文件 stdio.h 1.1.3 usleep() 作用:让程序休眠指定微秒,如: usleep(100000); //让程序休眠100000微秒(

    2024年02月02日
    浏览(32)
  • linux第一个小程序 --- 进度条【简洁】

    结果:先输入hello world然后休眠三秒后结束 当去掉’\\\'n“ 后,结果就变成了先休眠三秒,然后打印hello world后结束。 该现象就证明了缓冲区的存在。 当缓冲区中遇到’‘n’\\\'或者缓冲区被写满后才会被打印出来,在第二张图片里面,没有n,所以hello world先被写入缓存区,然后

    2024年01月20日
    浏览(29)
  • Linux第一个小程序-进度条(c语言版)

    目录 行缓冲区概念: 行缓冲区代码演示: ​编辑进度条代码 1:memset函数: 2:const char* lable=\\\"|/-\\\\\\\";  3:usleep C语言 usleep 函数的功能和用法: 4:进度条代码的实现.c文件与.h文件: ​编辑​编辑5:运行截图 ​编辑进度条代码的实用性优化 优化1:processbar函数内部循环改为

    2024年01月15日
    浏览(38)
  • 【Linux】从0到1实现一个进度条小程序

    个人主页:🍝在肯德基吃麻辣烫 我的gitee:gitee仓库 分享一句喜欢的话:热烈的火焰,冰封在最沉默的火山深处 进度条实现: 本文讲解如何从0到1实现一个进度条小程序。 我们在写作文的时候,写到了一行的结尾,就得另起一行并到开头继续写。 其中,这个另起一行的动作

    2024年02月14日
    浏览(38)
  • 《Linux从练气到飞升》No.07 Linux第一个小程序-进度条的实现

    🕺作者: 主页 我的专栏 C语言从0到1 探秘C++ 数据结构从0到1 探秘Linux 菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇 码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢阅读!!! 前面几章我们讲述了Linux指令、权限管理、编辑器

    2024年02月14日
    浏览(28)
  • 【Linux】:Linux项目自动化构建工具——make/Makefile || Linux第一个小程序——进度条(简单版本)

    在本章开始给大家分享一个图片 希望对你有帮助 在这里插入图片描述 在开始本章之前 我们需要回顾一下上节课的函数的动静态库的优缺点 动态库的优点: 比较节省资源(这里说的资源不仅仅是磁盘资源 也包括网络资源 内存资源等等),不会出现太多的重复代码 缺点:对

    2024年02月05日
    浏览(32)
  • 【Linux】:使用git命令行 || 在github创建项目 || Linux第一个小程序——进度条(进阶版本)

    在本章开始之前还是先给大家分享一张图片 这是C++的笔试题 感兴趣的同学可以去试一试 有难度的哟 也可以直接在牛客网直接搜索这几道题目哈 好了今天我们正式进入我们的正题部分 安装git 使用 Github 创建项目 注册账号 创建项目 ♨️1. 登陆成功后, 进入个人主页, 点击左下

    2024年02月05日
    浏览(40)
  • 【Linux】Linux小程序-进度条

    目录         一、r和n的理解         二、行缓冲区概念         三、进度条源代码 r:回车; n:换行;     那么请问这两个有什么区别呢?     比如:我们在编写内容的时候,一行没有写完的情况下,需要换到下一行的开始位置,此时需要两个步骤:    

    2024年02月06日
    浏览(23)
  • Linux 小程序-进度条

            1.回车换行                 回车换行是两个动作;                 回车是将光标移至当前行的最左侧,                 换行是将当前光标位置移至下一行的相同位置。         2.缓冲区                 由c语言维护的一段内存                  1.stdout:标

    2024年02月10日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包