【linux】实现一个彩色进度条

要实现一个进度条代码,首先要知道以下知识点:

\r:回车,将光标的位置重新定位在当前行的开头

\n:换行,将光标的位置定位在下一行的同一位置

\r\n:回车换行,将光标位置定位在下一行开头

  • 缓冲区

printf输出时,输出的内容会先放在输出缓冲区中,遇到下列几种情况时才会输出到屏幕:①遇到‘\n’ ;②遇到输入函数(scanf,getchar等);③用fflush(stdout)自动清空输出缓冲区;④遇到程序结束 ;⑤ 缓冲区满。

如果我们没有遇到回车换行符,缓冲区不会立刻将数据显示出来,而是进入sleep函数中,实际上最新执行的仍然是sleep之前的程序,因为没有\n出现,所以数据先会被放在缓冲区中,所以我们需要用fflush(stdout)强制刷新缓冲区。

  • 关于设置颜色:

颜色的实现只需要在需要显示颜色的部分输入颜色的编号即可,但是最重要的是我们需要在最后用\33[0m关闭所有属性,不然程序运行后会在运行后的后续文字中也变为你所设置的颜色,但是如果用ls命令,你会发现颜色由恢复原来的样子,因为ls命令有内置的\033[0m代码来关闭所以属性。

  • 具体实现代码如下:

#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main()
{
	int i = 0;
	char bar[102];
	memset(bar, 0, sizeof(bar));
	const char *lable = "|/-\\";
	while (i <= 100)
	{
		if (i < 10)
		{
			printf("\33[41m[%s]\33[0m[%d%%][%c]\r", bar, i, lable[i % 4]);
		}//"\33[41m...\33[0m"表示背景色设为深红色
		if (i >= 10 && i < 20)
		{
			printf("\33[43m[%s]\33[0m[%d%%][%c]\r", bar, i, lable[i % 4]);
		}
		if (i >= 20 && i < 30)
		{
			printf("\33[42m[%s]\33[0m[%d%%][%c]\r", bar, i, lable[i % 4]);
		}
		if (i >= 30 && i < 40)
		{
			printf("\33[47m[%s]\33[0m[%d%%][%c]\r", bar, i, lable[i % 4]);
		}
		if (i >= 40 && i < 50)
		{
			printf("\33[45m[%s]\33[0m[%d%%][%c]\r", bar, i, lable[i % 4]);
		}
		if (i >= 50 && i < 60)
		{
			printf("\33[42m[%s]\33[0m[%d%%][]%c\r", bar, i, lable[i % 4]);
		}
		if (i >= 60 && i < 75)
		{
			printf("\33[40m[%s]\33[0m[%d%%][%c]\r", bar, i, lable[i % 4]);
		}
		if (i >= 75 && i < 90)
		{
			printf("\33[46m[%s]\33[0m[%d%%][%c]\r", bar, i, lable[i % 4]);
		}
		if (i >= 90 && i <= 100)
		{
			printf("\33[44m[%s]\33[0m[%d%%][%c]\r", bar, i, lable[i % 4]);
		}
		fflush(stdout);//刷新缓冲区
		bar[i++] = ' ';
		usleep(45000);//由于程序运行的速度非常快,我们可能只能看到最终的输出结果,而捕捉不到每次的输出结果,所以,每输出一次,令程序睡眠0.1s,这里需要用到函数usleep函数
	}
	printf("\n");
	return 0;
}


 

猜你喜欢

转载自blog.csdn.net/qq_42270373/article/details/84036075