文章目录
- character
- 缓冲区的问题:
- ps. sleep 函数
- 倒计时
- 进度条
- 1.打印进度条
- 2.让进度条“动起来”
- 3.预留进度条的位置并用提示符显示进度条的状态
- 4.颜色打印
- 只用颜色来表示进度条
character
- 回车 与 换行
键盘上的 Enter 键:
换行的过程:
\r
:回车
\n
:换行+回车
缓冲区的问题:
- 〖文件 test1.c 〗
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("Hello RoundBottle!\n");
sleep(1);
return 0;
}
test1.c 编译后的执行结果:
上述代码分析:\n
换行符被执行后 缓冲区被刷新 ,显示器上打印——Hello RoundBottle!\n,然后执行 sleep 函数,延时一秒后,显示器上从光标所在位置打印操作提示符。
ps. sleep 函数
头文件:#include <unistd.h>
- 〖文件 test2.c〗
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("Hello RoundBottle!\r");
fflush(stdout);
sleep(1);
return 0;
}
test2.c 编译后的执行结果:
- 为什么会产生这样的结果? 👆
对于要打印到显示器的内容,该内容先会被放入缓冲区,当缓冲区被刷新,要打印的内容被从缓冲区拿出来才能被打印在显示器上。 fflush
可以主动刷新缓冲区;程序进程结束,缓冲区会被自动刷新,然后这个内容会快速的被 接下来要打印到显示器上的操作提示符 给覆盖。
程序进程结束,缓冲区自动刷新如下示例:
- 〖文件 test3.c 〗
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("Helle RounBottle!");
sleep(1);
return 0;
}
test3.c 编译后的执行结果:
上述代码分析:执行完 sleep 延时函数之后,程序进程结束,缓冲区被刷新,要打印的内容被打印到显示器上,紧接着打印操作提示符。
倒计时
根据上述内容,我们可以根据这个特性写一个“倒计时”:
- 从 9 → 0 的倒计时
#include <stdio.h>
#include <unistd.h>
int main()
{
int i=9;
while(i>=0)
{
printf("%d\r",i);
fflush(stdout);
sleep(1);
i--;
}
return 0;
}
运行结果:
- 从 10 → 0 的倒计时
#include<stdio.h>
#include<unistd.h>
int main()
{
int i=10;
while(i>=0)
{
printf("%2d\r",i);
fflush(stdout);
sleep(1);
i--;
}
printf("\n");
return 0;
}
注意:凡是向显示器打印所有的内容都是字符!例如 printf("%d",123)
实际上是在显示器上打印了‘1’‘2’‘3’字符,如果打印 10 ,光标回到开头再打印 9,就会变成——90,依此类推,如下所示:
所以,更好的打印方式:printf("%2d\r",i);
从10开始的倒计时运行结果:
进度条
要求:[ 用符号显示进度 ] [进度百分比]
示例:
同样的,.h文件包含需要的头文件并声明函数,.c文件中定义函数
[RoundBottle@VM-12-2-centos Progressbar]$ cat proc.h
#pragma once
#include<stdio.h>
#include<unistd.h>
#include <string.h>
void process();
[RoundBottle@VM-12-2-centos Progressbar]$ cat main.c
#include "proc.h"
int main()
{
process();
return 0;
}
[RoundBottle@VM-12-2-centos Progressbar]$ cat proc1.c
#include "proc.h"
#define MARK '#'
#define NUM 100
void process()
{
int i=0;
char str[NUM]={0};
memset(str,'\0',NUM);
for(;i<=NUM;++i)
{
memset(str,MARK,i);
printf("[%s][%d%%]\n",str,i);
}
}
-
同样的,我们写一个 Makefile 的文件,通过 make 指令来对文件进行编译,关于此部分的详见文章👉【Linux】2.3 编译器—gcc/g++ && 项目自动化构建工具—make/Makefile
-
关于 memset函数简单理解的用法
memset(一个地址,这个地址所指向的空间要被写入 什么内容 ,从这个地址包括这个地址所指向的空间往后写 多少个 )
(详见cplusplus.com:memset)
1.打印进度条
- pb1:
[RoundBottle@VM-12-2-centos Progressbar]$ ./pb1
[][0%]
[#][1%]
[##][2%]
[###][3%]
[####][4%]
[#####][5%]
[######][6%]
[#######][7%]
[########][8%]
[#########][9%]
[##########][10%]
[###########][11%]
[############][12%]
[#############][13%]
[##############][14%]
[###############][15%]
[################][16%]
[#################][17%]
[##################][18%]
[###################][19%]
[####################][20%]
[#####################][21%]
[######################][22%]
[#######################][23%]
[########################][24%]
[#########################][25%]
[##########################][26%]
[###########################][27%]
[############################][28%]
[#############################][29%]
[##############################][30%]
[###############################][31%]
[################################][32%]
[#################################][33%]
[##################################][34%]
[###################################][35%]
[####################################][36%]
[#####################################][37%]
[######################################][38%]
[#######################################][39%]
[########################################][40%]
[#########################################][41%]
[##########################################][42%]
[###########################################][43%]
[############################################][44%]
[#############################################][45%]
[##############################################][46%]
[###############################################][47%]
[################################################][48%]
[#################################################][49%]
[##################################################][50%]
[###################################################][51%]
[####################################################][52%]
[#####################################################][53%]
[######################################################][54%]
[#######################################################][55%]
[########################################################][56%]
[#########################################################][57%]
[##########################################################][58%]
[###########################################################][59%]
[############################################################][60%]
[#############################################################][61%]
[##############################################################][62%]
[###############################################################][63%]
[################################################################][64%]
[#################################################################][65%]
[##################################################################][66%]
[###################################################################][67%]
[####################################################################][68%]
[#####################################################################][69%]
[######################################################################][70%]
[#######################################################################][71%]
[########################################################################][72%]
[#########################################################################][73%]
[##########################################################################][74%]
[###########################################################################][75%]
[############################################################################][76%]
[#############################################################################][77%]
[##############################################################################][78%]
[###############################################################################][79%]
[################################################################################][80%]
[#################################################################################][81%]
[##################################################################################][82%]
[###################################################################################][83%]
[####################################################################################][84%]
[#####################################################################################][85%]
[######################################################################################][86%]
[#######################################################################################][87%]
[########################################################################################][88%]
[#########################################################################################][89%]
[##########################################################################################][90%]
[###########################################################################################][91%]
[############################################################################################][92%]
[#############################################################################################][93%]
[##############################################################################################][94%]
[###############################################################################################][95%]
[################################################################################################][96%]
[#################################################################################################][97%]
[##################################################################################################][98%]
[###################################################################################################][99%]
[####################################################################################################][100%]
2.让进度条“动起来”
[RoundBottle@VM-12-2-centos Progressbar]$ cat proc2.c
#include "proc.h"
#define MARK '#'
#define NUM 100
void process()
{
int i=0;
char str[NUM]={0};
memset(str,'\0',NUM);
for(;i<=NUM;++i)
{
memset(str,MARK,i);
printf("[%s][%d%%]\r",str,i); //输出一次进度条后让光标回到一行开头的位置
fflush(stdout); //刷新缓冲区,将要打印的内容打印到显示器上
usleep(100000);
}
printf("\n");
}
\r
:回车——使得光标回到行首的位置usleep
函数:(ps. microsecond—微秒; 1 微秒 = 10-6s )
- 注:循环结束
printf("\n");
是为了——最后进度条完成进度之后,不被接下来要打印在显示器上的操作提示符给覆盖。
运行结果:
3.预留进度条的位置并用提示符显示进度条的状态
预留进度条的位置——初始化进度条的内容为空格。
因为进度加载的过程中可能卡住,所以我们需要一个符号来显示进度条的状态——正在加载/加载已经终止/进度加载完成
[RoundBottle@VM-12-2-centos Progressbar]$ cat proc3.c
#include "proc.h"
#define MARK '#'
#define NUM 100
void process()
{
int i=0;
char symbol[]={'|','/','-','\\','\0'};
char str[NUM]={0};
memset(str,' ',NUM);
for(;i<=NUM;++i)
{
memset(str,MARK,i);
printf("[%s][%d%%][%c]\r",str,i,symbol[i%4]);
fflush(stdout);
usleep(100000);
}
printf("\n");
}
运行结果:
4.颜色打印
- 格式:
\033[字背景颜色;字体颜色m字符串\033[0m
(这里进度条的样式换了另外的符号表示,这个不重要,看自己需求选择)
[RoundBottle@VM-12-2-centos Progressbar]$ cat proc4.c
#include "proc.h"
#define MARK '-'
#define NUM 100
void process()
{
int i=0;
char symbol[]={'|','/','-','\\','\0'};
char str[NUM]={0};
memset(str,' ',NUM);
for(;i<=NUM;++i)
{
memset(str,MARK,i);
if(i!=NUM)
{
str[i]='>';
}
printf("\033[40;44m[%s]\033[0m[%3d%%][%c]\r",str,i,symbol[i%4]);
fflush(stdout);
usleep(100000);
}
printf("\n");
}
注意:这里的 i
和数组下标是不对应的!
运行结果:
只用颜色来表示进度条
[RoundBottle@VM-12-2-centos Progressbar]$ cat proc5.c
#include "proc.h"
#define NUM 100
void process()
{
int i=0;
char symbol[]={'|','/','-','\\','\0'};
char str[NUM]={0};
memset(str,' ',NUM);
for(;i<=NUM;++i)
{
int num=i;
while(num--)
{
printf("\033[44;37m%c\033[0m",str[num]);
}
printf("[%3d%%][%c]\r",i,symbol[i%4]);
fflush(stdout);
usleep(100000);
}
printf("\n");
}
运行结果:
END