ToB企服应用市场:ToB评测及商务社交产业平台
标题:
Linux小程序——进度条
[打印本页]
作者:
tsx81429
时间:
2024-6-9 15:35
标题:
Linux小程序——进度条
前言:哈喽小伙伴们,颠末我们对多个Linux基本开辟工具的学习之后,对于Linux的使用也算是更上一层楼。
以是这篇文章,我们就尝试使用我们学过的Linux知识来写一个小程序——
进度条
,达到
实践以及加深知识映像的效果
。
目录
一.什么是进度条
二.缓冲区
三.简易倒计时
四.进度条
五.完整代码展示
1.Progressbar.h
2.Progressbar.c
总结
一.什么是进度条
进度条信赖大家都不生疏,
平时玩游戏的时间都会有数据加载进度条
。那么你知道进度条的原理是什么吗???
我们先来认识两个符号:
\n:换行符,从头开始另起一行
\r:回车符,使光标回到本行的开头
二.缓冲区
首先我们要知道,在
程序文件的加载过程中,不是一路顺风的,常常会出现卡顿和进度忽然变快和变慢的情况
,这就要关系到
缓冲区
的概念了。
大家一定都认识
sleep()睡眠函数
,使用它需要包含
头文件#include<unistd.h>
,它的作用是可以或许
让程序在某个位置停留一定时间后再继续运行,
下面我们就来展示一下:
我们设置
睡眠时间为3秒
,然后运行:
可以或许看出,
printf函数打印完之后,程序并没有立刻克制,而是停留了一段时间再竣事
。
现在同样的代码,我只修改一个地方:
将“\n”换行符去掉
,我们在运行一次:
会发现
初始的时间什么都没有,过3秒之后才将结果打印并退出
。
这是为什么呢???
现实上,我们的printf函数所输出的数据一开始是存放在
缓冲区
的,
缓冲区里的数据会在程序竣事时才会被冲刷并打印在表现器上
,而这里的
sleep函数的作用就是让程序睡眠一定时间后再停止
,
以是“hello linux”才会过3秒后才打印
。
但是有一种特别情况就是
“\n”
,它可以或许
立即刷新一次缓冲区
,
从而让包括它在内的之前的全部数据立即打印
。
除此了“\n”之外,还有一个函数可以主动冲刷缓冲区,它就是
fflush()
,给他传入形参
stdout
:
三.简易倒计时
学习完缓冲区的知识之后,我们就可以或许制作一个简易的倒计时了,直接来看代码:
通过
while循环打印
,我们使用
\r回车符
,
每打印一次之后就让光标回到行头
,
但是这样会造成覆盖,导致我们的倒计时无法表现
,以是我们需要
使用fflush逼迫将倒计时打印出来,并使用sleep使打印的隔断为1秒
,实现倒计时:
由于不方便录视频,以是我们展示两张截图作为参考。
四.进度条
在linux写一个独立项目,我们同样需要按照C/C++的方式来,
一个头文件,两个源文件
:
唯一值得注意的是,这次我们要
多写一个makefile文件,资助我们实行指令
。
想要
多文件同时操作
,不要忘记vim的操作方式:
在底行模式下输入vs + 文件名,再通过ctrl+ww,可以使光标在不同文件中移动
。
下面我们通过一步一步分析来写代码,完成进度条的制作过程:
我们要
先将全部文件的基本代码编写完成
:
并进行测试:
确认无误后,我们就可以
只对Progressbar.h和Progressbar.c两个文件进行编辑了
。
首先我们要知道,进度条基本都是通过特别字符来表现的,这里我们
用‘#’字符来当做进度条
。
其次,进度条的加载过程,就像上边的倒计时一样
需要循环
,而且
字符是渐渐增加的
,这样我们就可以考虑
使用字符数组
了。
如果是100%加载的话,那么数组的长度就要是100
。
那么
为了方便日后我们更换进度条的符号以及数组的大小,我们都使用宏定义
:
#define type #
#define Length 100
创建完数组之后,如果我们
不初始化的话,则会默认附随机值,影响我们打印
,以是我们
可以使用memset将数组元素均赋值为‘\0’
,使用memset需要
头文件#include<string.h>
:
char bar[length];
memset(bar,'\0',sizeof(bar));
随后我们就可以进行循环打印:
int count = 0;
while(count <= Length)
{
printf("[%-100s][%d%%]\r",bar,count);
fflush(stdout);
bar[count++] = type;
usleep(500000);
}
复制代码
除了
printf
里边的代码,其他的信赖小伙伴们都可以或许明白,下面我们就来细致解说一下
printf
:
我们要打印的,也就两个东西,
一是进度条,二是表现已经加载了多少的百分比数字
。
这个进度条,我们
用“[]”来括起来
,而且我们
渴望这个“[]”已经是固定的长度,随后让“#”去一点点增长
,以是我们
需要在%s中间加一个-100,也就是数据向右空出100个空格
。
然后就是百分比数字表现,我们就
直接打印count
,这里
要注意一下如果想要打印出“%”,就需要使用“%%”
。
初始情况下,bar数组为空
,然后
每打印一次,就将bar数组的一个元素改为“#”。
由于sleep函数只能睡眠整数秒,但是睡眠100时间又太长,以是我们使用usleep()微秒睡眠函数,其中1*1000*1000为1秒,以是我们睡眠0.5秒则传参500000。
如此循环100次,便可实现进度条:
五.完整代码展示
1.Progressbar.h
#pragma once
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#define type '#'
#define Length 100
void Probar();
复制代码
2.Progressbar.c
#include"Progressbar.h"
void Probar()
{
char bar[Length];
memset(bar,'\0',sizeof(bar));
int count = 0;
while(count <= Length)
{
printf("[%-100s][%d%%]\r",bar,count);
fflush(stdout);
bar[count++] = type;
usleep(500000);
}
printf("\n");
}
复制代码
总结
简易的进度条的制作过程就分享到这里啦,渴望可以或许让小伙伴们对linux开辟工具的使用更进一步,同时在Linux上编程也更加顺手。
末了还是要记得
一键三连
哦,我们下期再见!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4