本文主要讲解在linux系统下实现进度条以及倒计时小程序

文章目录

  • 成果展示
  • 1、`\r和\n`
    • 理解字符含义:
    • 测试字符
      • (1)`\r和\n`都存在
      • (2)`\r和\n`都不存在
      • (3) `只有\n`
      • (4) `只有\r`
  • 2、缓冲区的概念
  • 3、倒计时小程序
  • 4 、进度条小程序
    • 代码如下:

成果展示


看似花哨,其实很容易的,我们只需要了解两个知识点即可
1. \r和\n
2. 行缓冲区
3. 关于makemakefile,大家看我前面几篇博客,因为小项目里面也使用了这个知识点
大家跟我一起学起来吧!


1、\r和\n

理解字符含义:

我们再学C语言的时候,我们有很多字符,一种是可显字符,另一种是控制字符

我们在一行内容没有写完,然后要换到下一行的开始,我们要进行两个操作,
1:\n(换行)
让光标从第一行跳到第二行,但是光标只是垂直向下跳,并没有在第二行的开始。
2:\r(回车)
在第二行让光标跳到最开始的位置,这个操作就是回车。

有的同学就问,我们在C语言的时候,怎么用\n来换行加回车。这是我们在这个语言环境下我们将其简化,此时的\n就表示回车加换行。

测试字符

我们一共测试四种情况,
(1):\r和\n都存在
(2):\r和\n都不存在
(3):只有\n
(4):只有\r

(1)\r和\n都存在

现象:就相当于\n直接跳到下一行的开头

我们看下图发现,我们在其中既有回车又有换行,所以其linux的命令行在我们执行程序下面。

(2)\r和\n都不存在

现象:linux命令行紧跟着打印的信息
因为我们结尾啥都没有,那光标就还在结尾,所以linux命令行紧跟我们的打印信息

(3) 只有\n

这个就是和我们的换行+回车,和我们平时用的一样,只不过我们的编译器将两步简化为一步了,我们只需要输入\n即可

(4) 只有\r

现象:看不到打印的信息了。只能看到linux命令行
解释:因为我们\r,只有回车的效果,我们本来光标在文本行的最后一个字符旁边,但是我们识别到\r字符,所以,直接回车,光标来到了文本行的开始。这时linux的命令行就会从光标处开始,将我们的文本覆盖掉,我们就什们都看不到。

2、缓冲区的概念

#include<stdio.h>
#include<unistd.h>int main()
{printf("hello world");sleep(3);
}

现象:我们发现,hello world没有立刻刷新出来,数据一定在sleep期间被保存起来,但是我们加上\n,数据就会先显示出来。
就是因为缓冲区有自己的行缓冲刷新策略。

3、倒计时小程序

我们知道了上面两个知识点,\r将光标回到最开始就可以将其覆盖掉,所以我们利用这个特点可以写一个倒计时小程序,我们先写一个10秒以内的倒计时小程序。

  1 #include<stdio.h>2 #include<unistd.h>3 4 int main()5 {6   int i=0;7   for(i=9;i>=0;i--)8   {9     printf("%d\r",i);10                                                                                                            11     sleep(1);12   }13   return 0;14 }

我们发现这样倒计时不显示,原因是数据存放在缓冲区里,我们没有刷新缓冲区,所以我们没有显示,所以我们修改一下就OK了

1 #include<stdio.h>2 #include<unistd.h>3 4 int main()5 {6   int i=0;7   for(i=9;i>=0;i--)8   {9     printf("%d\r",i);10     fflush(stdout);     //刷新缓存区                                                                                                      11     sleep(1);12   }13   return 0;15 }

这样我们的倒计时代码就改好了,但是如果我们突然变成10秒以后的,发现不能将两位数字都覆盖掉,因为最后由两位数变成了1位数,所以我们还要做一点修改。

1 #include<stdio.h>2 #include<unistd.h>3 4 int main()5 {6   int i=0;7   for(i=9;i>=0;i--)8   {9     printf("%-2d\r",i);10     fflush(stdout);                                                                                                          11     sleep(1);12   }13   return 0;15 }
~

现象:

4 、进度条小程序

进度条样式 :

  • 主体样式为两个中括号包裹,中间=>推进的方式呈现,比如:[======]
  • 主体右侧中括号位置保持不变,中间元素不断推进,比如:[= ]
  • 显示当前加载进度,用 [num%] 显示,num 随着进度条的不断推进而变化
  • 显示加载样式,可以利用一个旋转的字符,例如 [\] 的样式,顺时针不断旋转
    大约呈现状态为:[========>] [15%] [\]

采用多文件 :

文件存放在 proc 目录中

  • proc.h :函数声明
  • proc.c :进度条逻辑
  • main.c :函数调用

代码如下:

proc.h

1 #pragma once2 #include <stdio.h>3 #include <unistd.h>4 #include <string.h>5 6 7 //进度条函数8 void Progress();

proc.c

 #include "proc.h"2 3 void Progress()4 {5   const char*  label = "|/-\\";//多加一个\是防止\成为转移字符6   char bar[101];7   memset(bar,'\0',sizeof(bar));//将数组全部初始化为\0,因为如果不初始化的话,数组的元素是随机值8 9   int i = 0;10   while(i <= 100)11   {12     printf("[%-100s][%d%%] [%c]\r",bar,i,label[i%4]);13     fflush(stdout);//刷新缓冲区                                                                                                                     14 15     bar[i++] = '#';//每次向数组写一个#16     usleep(100000);17   }18   printf("\n");19 }

main.c

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

《Linux小项目-倒计时+进度条》相关推荐

  1. ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  2. ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  3. 信息学奥赛真题解析(玩具谜题)

    玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...

  4. 信息学奥赛之初赛 第1轮 讲解(01-08课)

    信息学奥赛之初赛讲解 01 计算机概述 系统基本结构 信息学奥赛之初赛讲解 01 计算机概述 系统基本结构_哔哩哔哩_bilibili 信息学奥赛之初赛讲解 02 软件系统 计算机语言 进制转换 信息 ...

  5. 信息学奥赛一本通习题答案(五)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  6. 信息学奥赛一本通习题答案(三)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  7. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  8. 信息学奥赛一本通题目代码(非题库)

    为了完善自己学c++,很多人都去读相关文献,就比如<信息学奥赛一本通>,可又对题目无从下手,从今天开始,我将把书上的题目一 一的解析下来,可以做参考,如果有错,可以告诉我,将在下次解析里重 ...

  9. 信息学奥赛一本通(C++版) 刷题 记录

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...

  10. 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离

    首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...

最新文章

  1. Android关于Task的一些实践之SingleTask, SingleInstance和TaskAffinity
  2. AngularJs $cacheFactory 缓存服务
  3. C语言面试算法题(一)
  4. 进制转换c++代码_跟小黑学漏洞利用开发之16进制字符转换
  5. java比ios慢_Android为什么比iOS慢
  6. 超级马里奥代码_任天堂的源码泄露,揭示超级马里奥的前世之生
  7. 机器学习集群_机器学习中的多合一集群技术在无监督学习中应该了解
  8. mac远程redis_「实战篇」开源项目docker化运维部署-redis高速缓存(六)
  9. 多模块顺序_软件架构基础 3: 什么是好的模块化代码?高内聚、低耦合如何衡量?...
  10. 计算机考研 外部排序,2021考研408数据结构基础知识点:外部排序
  11. wps的广告怎么彻底关闭
  12. 计算机与汉字+输入速度+云输入法,学拼音打字练习
  13. 攻防世界-Crypto-告诉你个秘密(键盘密码)-ISCC2017
  14. esxcli software vib 命令为 ESXi 5.x/6.x 主机安装补丁程序 (2008939)
  15. 在线培训机构需公示教师资格证 一对一业务将最受影响
  16. 全球与中国能力和技能管理软件市场深度研究分析报告
  17. 今日头条广告如何优化?这四个思路至关重要
  18. glob模块中的glob.glob和golb.iglob
  19. katka-container搭建
  20. 这帮死磕技术的理工男造了一支笔

热门文章

  1. 数据结构_线性结构和非线性结构
  2. MyEclipse 2016 CI 安装教程及最详细的破解教程(内附有正版安装包及破解工具)
  3. Echarts-阶梯折线堆叠图 - x、y轴动态获取
  4. sql注入关于waf的绕过
  5. 打造一个优雅的微信文章编辑器
  6. (ICASSP 19)Streaming End-to-end Speech Recognition for Mobile Devices
  7. 财务rpa机器人 快速实现企业财务自动化
  8. java发送qq消息
  9. 【李沐AI自学】线性神经网络
  10. html网页布局白边问题