【闪击Linux系列P7】进度条小程序の深度解剖
前言
大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎! 本章主要内容面向接触过Linux的老铁,主要内容含
欢迎订阅 YY滴Linux专栏!更多干货持续更新!以下是传送门!
订阅专栏阅读: YY的《Linux》系列 ❀❀❀❀❀ |
---|
【Linux系列-P1】Linux环境的搭建 |
【Linux系列-P2】 Linux的基本知识与指令 |
【Linux系列-P3】 Linux的权限 |
【Linux系列-P4】 Linux基本工具[yum][vim] |
目录
一.在Linux中的设置
- 用vim分别建立【main.c】【makefile】【processbar】【processBar.c】【processbar.h】,可视具体情况设置,文末有简略代码;
- makefile文件如图所示
> - ./processbar 执行程序
细节:为什么在makefile中不用包含头文件?
- 头文件就在源代码的当前目录下,编译器会自动去找到头文件
二.必备概念梳理
1.回车与换行的区别
- 回车:光标回到当前行的左端
- 换行:跳转到当前的下一行
- PS:现在我们键盘上的ENTER同时兼备了回车和换行的功能,
- 在C语言中"n"表示回车加换行,"r"单单指的是回车;
2.缓冲区概念
引入: 缓冲区是C语言维护的一段内存
C语言会默认打开三个输入输出的文件,分别是标准输入流stdin,标准输出流stdout,标准错误stderr
在进度条小程序中,我们要特别注意标准输出流stdout
一.“n”和“r”在缓冲区中的作用效果差别
- 众所周知,在Linux中,显示器可以被当作一个文件;
- 而且显示器默认是行刷新,也就是当输出内容配上“n”后会直接回车+换行并立刻将内容打印在屏幕上,待睡眠结束后,才会弹出操作框;
- 而当输出内容配上“r”后,其会先输出到缓冲区中,待睡眠结束后才会和操作框一起输出;
#include <stdio.h>
int main()
{
printf("hello Makefile!n");先行打印,待睡眠结束后才弹出操作框
sleep(3);
return 0;
printf("hello Makefile!r");待睡眠结束后才会和操作框一起打印
}
二.fflush函数
- fflush是一个在C语言标准输入输出库中的函数,功能是冲洗流中的信息,该函数通常用于处理磁盘文件。fflush()会强迫将缓冲区内的数据写回参数stream 指定的文件中。
- 在下面代码块中,"hello Makefile!"本来应该待睡眠结束后才会和操作框一起弹出,在此之前存储在缓冲区中;但我们用了fflush(stdout);(stdout是其数据类型),直接将内容从缓冲区中写回显示器文件中;
- 最终完成的效果是:先行打印,待睡眠结束后才弹出操作框
#include <stdio.h>
int main()
{
printf("hello Makefile!r");
fflush(stdout);
sleep(3);
return 0;
}
三.fflush函数的应用:倒计时功能
1.倒计时功能的实现原理
- 利用不断的回车和刷新实现
2.数据类型的表示细节
- 显示2位数的数字 printf(“%2dr”,cnt);
- 此时功能正常【10,9,8…1,0】
- 左对齐 printf(“%-2dr”,cnt);
3.倒计时功能完整代码
#include <stdio.h>
#include <unistd.h>
int main()
{
int cnt=10;倒计时功能
while(cnt>=0)
{
printf("%dr",cnt); 此时屏幕出现【10,90,80...10,00】,功能异常;
fflush(stdout);
cut--;
sleep(1);
}
return 0;
}
三.设计进度条的各个部分
1.设计进度条主体部分
1.打印时为进度条预留空间
- 设计一个字符数组,并初始化;此时其为一个空串;
memset(bar, 0 ,sizeof(bar));
2.调整进度条主体加载方向
- 在Linux环境下, 行默认是右对齐;所以随着不断的回车与换行,进度条呈现出来的效果是自右向左移动;
- 我们只需要改为 [%-100s] 即可
printf("[%-100s]r", bar);
3.进度条主体部分代码
#include <unistd.h>
int main()
{
int i = 0;
char bar[102];
memset(bar, 0 ,sizeof(bar));
while(i <= 100 )
{
printf("[%-100s]r", bar);
fflush(stdout);
bar[i++] = '#';
usleep(10000);
}
}
2.设计百分号进度部分
一.设计细节:“%如何表示”
- 细节:由于【 % +''字母为 数据类型】,斜杠【%】用【%%】表示
二.实现原理
- while循环
int main()
{
int i = 0;
while(i <= 100 )
{
printf("[%d%%]",i);
fflush(stdout);
}
return 0;
}
3.设计旋转光标部分
一.设计细节:“ 如何表示”
- 细节:由于【 +''为 转义字符】,斜杠【】用【\】表示
二.实现原理
- 常量字符串配合上【 i++% 4】
- 【 -r 回车】 +【 fflush刷新图标】; 下一轮while循环,直接覆盖原来的字符,实现光标转动;
int main()
{
int i = 0;
const char *lable="|/-\";
while(i <= 100 )
{
printf("[%c]r",lable[i++%4]);
fflush(stdout);
}
}
四.进度条完整代码
#include <unistd.h>
#include <string.h>
int main()
{
int i = 0;
char bar[102];
memset(bar, 0 ,sizeof(bar));
const char *lable="|/-\";
while(i <= 100 )
{
printf("[%-100s][%d%%][%c]r", bar, i, lable[i%4]);
fflush(stdout);
bar[i++] = '#';
usleep(10000);
}
printf("n");
return 0;
}