Linux下用C语言实现一个简单的彩色进度条

时间:2024-03-20 19:05:36

效果图

Linux下用C语言实现一个简单的彩色进度条

源代码

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

int main()
{
    printf("\033[2J");		//清屏
    printf("\033[?25l");	//隐藏光标
    int color = 31;			//设置颜色初始值
    int j;
    for(int i = 0; i <= 10; i++)
    {
        printf("\033[0;0H");		//移动光标到0,0坐标处
        printf("\033[47;%dm[",color);	//输出[
    
        if(color == 37)color = 30;			//因为背景色为白色,所以字体颜色跳过白色

        j = i * 2;									//这里乘2是因为输出10个字符的进度条看起来太短了
        while(j-- > 0)							//输出i*2个=
        {
            printf("\033[47;%dm=",color);
        }
        printf("\033[47;%dm>",color);		//输出>

        j = (10 - i) * 2;						//剩下的字符输出空格,乘2原因同上
        while(j-- > 0)						//输出(10-i)*2个空格
        {
            printf(" ");
        }

        if(i == 10)
            printf("\033[47;%dm]Done",color);		//如果到100%则显示Done
        else
             printf("\033[47;%dm]%d%%\n",color, 10*i);	//否则显示百分比
 
        color++;
        sleep(1);			//延时1s
    }
    getchar();				//起暂停作用
    printf("\033[?25h");		//显示光标
    return 0;
}

遇到的问题

在写进度条时我第一反应是使用\r来将光标挪回第一列,但是实际写出来使用\r而不\n的话不会每次都输出,而是延时了10s之后直接输出100%的进度条。
找这个问题找了很久,最后发现每次输出加个\n才会显示出来,但是加了\n就会到下一行了,于是就想出了这个清屏+移动光标的办法。

背景和字体颜色表

30 设置黑色前景
31 设置红色前景
32 设置绿色前景
33 设置棕色前景
34 设置蓝色前景
35 设置紫色前景
36 设置青色前景
37 设置白色前景
38 在缺省的前景颜色上设置下划线
39 在缺省的前景颜色上关闭下划线
40 设置黑色背景
41 设置红色背景
42 设置绿色背景
43 设置棕色背景
44 设置蓝色背景
45 设置紫色背景
46 设置青色背景
47 设置白色背景
49 设置缺省黑色背景

Linux下的常用光标操作

// 清除屏幕
#define CLEAR() printf("\033[2J")

// 上移光标
#define MOVEUP(x) printf("\033[%dA", (x))

// 下移光标
#define MOVEDOWN(x) printf("\033[%dB", (x))

// 左移光标
#define MOVELEFT(y) printf("\033[%dD", (y))

// 右移光标
#define MOVERIGHT(y) printf("\033[%dC",(y))

// 定位光标
#define MOVETO(x,y) printf("\033[%d;%dH", (x), (y))

// 光标复位
#define RESET_CURSOR() printf("\033[H")

// 隐藏光标
#define HIDE_CURSOR() printf("\033[?25l")

// 显示光标
#define SHOW_CURSOR() printf("\033[?25h")

//反显
#define HIGHT_LIGHT() printf("\033[7m")

#define UN_HIGHT_LIGHT() printf("\033[27m")