《Linux小项目-倒计时+进度条》
本文主要讲解在
linux
系统下实现进度条以及倒计时小程序
文章目录
- 成果展示
- 1、`\r和\n`
- 理解字符含义:
- 测试字符
- (1)`\r和\n`都存在
- (2)`\r和\n`都不存在
- (3) `只有\n`
- (4) `只有\r`
- 2、缓冲区的概念
- 3、倒计时小程序
- 4 、进度条小程序
- 代码如下:
成果展示
看似花哨,其实很容易的,我们只需要了解两个知识点即可
1. \r和\n
2. 行缓冲区
3. 关于make
和makefile
,大家看我前面几篇博客,因为小项目里面也使用了这个知识点
大家跟我一起学起来吧!
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小项目-倒计时+进度条》相关推荐
- ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)
视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...
- ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析
视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...
- 信息学奥赛真题解析(玩具谜题)
玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...
- 信息学奥赛之初赛 第1轮 讲解(01-08课)
信息学奥赛之初赛讲解 01 计算机概述 系统基本结构 信息学奥赛之初赛讲解 01 计算机概述 系统基本结构_哔哩哔哩_bilibili 信息学奥赛之初赛讲解 02 软件系统 计算机语言 进制转换 信息 ...
- 信息学奥赛一本通习题答案(五)
最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...
- 信息学奥赛一本通习题答案(三)
最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...
- 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题
第1章 快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章 素数 第 3 章 约数 第 4 章 同余问题 第 5 章 矩阵乘法 第 6 章 ...
- 信息学奥赛一本通题目代码(非题库)
为了完善自己学c++,很多人都去读相关文献,就比如<信息学奥赛一本通>,可又对题目无从下手,从今天开始,我将把书上的题目一 一的解析下来,可以做参考,如果有错,可以告诉我,将在下次解析里重 ...
- 信息学奥赛一本通(C++版) 刷题 记录
总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...
- 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离
首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...
最新文章
- Android关于Task的一些实践之SingleTask, SingleInstance和TaskAffinity
- AngularJs $cacheFactory 缓存服务
- C语言面试算法题(一)
- 进制转换c++代码_跟小黑学漏洞利用开发之16进制字符转换
- java比ios慢_Android为什么比iOS慢
- 超级马里奥代码_任天堂的源码泄露,揭示超级马里奥的前世之生
- 机器学习集群_机器学习中的多合一集群技术在无监督学习中应该了解
- mac远程redis_「实战篇」开源项目docker化运维部署-redis高速缓存(六)
- 多模块顺序_软件架构基础 3: 什么是好的模块化代码?高内聚、低耦合如何衡量?...
- 计算机考研 外部排序,2021考研408数据结构基础知识点:外部排序
- wps的广告怎么彻底关闭
- 计算机与汉字+输入速度+云输入法,学拼音打字练习
- 攻防世界-Crypto-告诉你个秘密(键盘密码)-ISCC2017
- esxcli software vib 命令为 ESXi 5.x/6.x 主机安装补丁程序 (2008939)
- 在线培训机构需公示教师资格证 一对一业务将最受影响
- 全球与中国能力和技能管理软件市场深度研究分析报告
- 今日头条广告如何优化?这四个思路至关重要
- glob模块中的glob.glob和golb.iglob
- katka-container搭建
- 这帮死磕技术的理工男造了一支笔