在实现进度条小程序之前,我们先来看两段小代码
test.c
#include<stdio.h>
int main()
{
printf("hello bit\n");
sleep(3);
return 0;
}
test1.c
#include<stdio.h>
int main()
{
printf("hello bit");
sleep(3);
return 0;
}
两个函数唯一的不同在于第一个printf里面多了一个\n
运行两个程序,我们可以观察到,test.c先打印hello bit ,然后谁3秒,而test1,先睡3秒,然后打印hello bit.
那么问题就来了,为什么会出现这种情况呢,printf肯定是先于sleep运行的,为什么最后才显示出来,这就引出了缓存区的问题,printf在打印时,并不是直接将结果输出到显示器上,而是将结果保存在缓存区。
第一个程序之所以先打印,是因为有一个\n,也就是所谓的换行,因为printf函数是一个行缓冲机制,它遇到\n后就会将缓冲区的内容刷新到显示屏上。
了解了printf函数的行缓冲机制,那么接下来我们就尝试来写一个进度条函数。
#include <stdio.h>
2 #include<string.h>
3 int main()
4 {
5 int i = 0;
6 char a[102];//由于数组包含两个[]所以数组大小是102
7 memset(a, 0, sizeof(a));
8 char* label = "|/-\\";//这里是来打印后面的提示。
9 while(i<=100)
10 {
11 a[i] ='#';
12 printf("[%-100s] [%d%%] %c \r", a, i,label[i%4]); //这里的[-100s]是将[]置于两端,'-'是进行左对齐
13 i++;
fflush(stdout);//刷新缓冲区,不然#的打印是一段一段的
15 usleep(100000);
16 }
17 printf("\n");
18 return 0;
19 }
实现完简单的进度条的代码后,我们是不是可以实现给进度调小程序加上颜色内。
在实现之前,我们先来了解一下,Linux下printf输出字符串的颜色
基本打印格式:
printf("\033[字背景颜色;字体颜色m字符串\033[0m" );
printf("\033[41;32m字体背景是红色,字是绿色\033[0m\n");
41是字背景颜色, 32是字体的颜色, 字体背景是红色,字是绿色是要输出的字符串. 后面的\033 …\033[0m是配对的为控制码。
先来说一下颜色和背景的代码
颜色代码:
QUOTE:
字背景颜色范围: 40–49 字颜色: 30–39
40: 黑 30: 黑
41: 红 31: 红
42: 绿 32: 绿
43: 黄 33: 黄
44: 蓝 34: 蓝
45: 紫 35: 紫
46: 深绿 36: 深绿
47: 白色 37: 白色
注意到总体范围是从30到49,在printf("\033[41;32m字体背景是红色,字是绿色\033[0m\n");中\033[41;32m是可以单独只指定背景颜色或者字体颜色的,这样另外的部分就是默认状态如\033[32m 表示字体是绿色背景默认而\033[41m 表示背景为红色字体默认。
所以我们可以通过设置字符串的背景颜色和颜色来实现输出效果控制。
1 #include <stdio.h>
2 #include<string.h>
3 int main()
4 {
5 int i = 0;
6 char a[102];
7 memset(a, 0, sizeof(a));
8 char* label = "|/-\\";
9 while(i<=100)
10 {
11 a[i] = ' ';
12 printf("\033[37;44m[%s]\033[0m [%d%%] %c \r", a, i, label[i%4]);
13 i++;
14 fflush(stdout);
15 usleep(100000);
16 }
17 printf("\n");
18 return 0;
19 }
~