1. 程式人生 > >Linux下進度條的實現(加彩色版本)

Linux下進度條的實現(加彩色版本)

一:進度條 關於進度條不用我多說,當我們在安裝程式或者軟體時通常會看到軟體安裝進度,而這個給我以視覺感受的進度表示,通常被叫做進度條。 二:進度條需要的知識儲備 緩衝區: 對於緩衝區這個概念我們其實並不陌生,它是能夠儲存固定數量的容器後者是一個儲存器,或者分段運輸區,其資料可被儲存一共後續檢索。C庫的寫入檔案函式一般是全緩衝方式,像printf、fwrite庫函式是自帶緩衝區的,而只有我們達到一種緩衝方式我們就可以重新整理緩衝區,以下是緩衝區的幾種型別: 1.行緩衝:一行的末尾只要有‘\n’我們即可重新整理緩衝區。 2. 全緩衝:把緩衝區寫滿,立刻重新整理緩衝區。 3. 無緩衝:系統呼叫無緩衝區函式。 當我們沒有遇到“\n”時,緩衝區不會立刻顯示資料的,而進入sleep函式時,實際上cpu執行的是sleep之前的程式,因為沒有遇到“\n”,資料仍被放在緩衝區中,不會被刷出,此時我們需要強制重新整理緩衝區,用fflush()函式當我們沒有遇到“\n”時,緩衝區不會立刻顯示資料的,而進入sleep函式時,實際上cpu執行的是sleep之前的程式,因為沒有遇到“\n”,資料仍被放在緩衝區中,不會被刷出,此時我們需要強制重新整理緩衝區,用fflush()函式。 三.簡單版本的進度條的實現

int main(void)
{
        char shift[4] = {'-','\\','|','/'};//用來製作動態旋轉的影象
        char bar[100] = {0};//進度條動態增長的圖形表示
        int i = 0;
        for(;i<=100;i++)
        {
                bar[i] = '#';
                printf("[%-100s][%c][%d%%]\r",bar,shift[i%4],i);
                fflush(stdout);//強制重新整理緩衝區
                usleep(100*1000);//控制增長速度,睡眠函式
        }
        printf("\n");
        return 0;
}

在這裡插入圖片描述 四:可以用來裝逼的版本(帶顏色的進度條) 首先我們得了解如何讓它帶顏色 1.下面是一些關於顏色的程式碼: 在這裡插入圖片描述 前景游標設定 在這裡插入圖片描述 背景游標設定 在這裡插入圖片描述 2.接下來我們在程式碼中用一下這寫設定看看到底如何來使用顏色配置

#include<unistd.h>

int main()
{
        printf("\33[31m 紅色字型\33[0m\n");
        printf("\33[45m\33[31m 紫色背景 紅色字\33[0m\n");
        printf("\33[45m\33[31m\33[4m\33[1m 紫色+紅色+高亮+下劃線\33[0m\n");
        return 0;
}

效果如下: 在這裡插入圖片描述 3.當我們做好了這些鋪墊之後,我們就可以入手寫一個帶顏色的進度跳了

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

int main(void)
{
        char shift[4] = {'-','\\','|','/'};//用來製作動態旋轉的影象
        char bar[100] = {0};//進度條動態增長的圖形表示
        int i = 0;
        for(;i<=100;i++)
        {
                bar[i] = '#';
                printf("\33[35m\33[1m[%-100s][%c]\33[0m[%d%%]\r",bar,shift[i%4],i);
                fflush(stdout);//強制重新整理緩衝區
                usleep(100*1000);//控制增長速度,睡眠函式
        }
        printf("\n");
        return 0;
}

效果如下: 在這裡插入圖片描述 下面我們還可以讓它更高大上一點: 讓它成為一個矩形的進度條而不是“#”號 讓它變成矩形增長我只需要變"#"為空格即可

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

int main(void)
{
        char shift[4] = {'-','\\','|','/'};
        char bar[100] = {0};
        int i = 0;
        for(;i<=100;i++)
        {
                bar[i] = ' ';
                printf("\033[47m\033[30m\033[1m %s\r%d%%\033[0m",bar,i);
                fflush(stdout);
                usleep(100*1000);
        }
        printf("\nDown.\n\033[?25h");
        return 0;
}


效果如下: 在這裡插入圖片描述