Linux下簡易彩色進度條

2021-08-17 06:01:35 字數 2474 閱讀 1800

個人部落格傳送門

前言在linux下安裝檔案的時候,都會有個進度條來提示我們安裝的進度是多少。這裡我們模擬輸出這個進度條。主要用到輸出函式的操作、緩衝區的重新整理、usleep函式、linux終端顏色的顯示等知識。

效果如下:

鋪墊知識點

緩衝區

緩衝區分位三種:無緩衝,行緩衝,全緩衝。

無緩衝:沒有緩衝,也就是資訊在輸入輸出的時候,立馬輸入或輸出。典型的代表就是標準錯誤流stderr。

行緩衝:當輸入輸出的時候,遇到換行才執行i/o操作。典型的代表是鍵盤的操作。

全緩衝:當輸入輸出寫滿緩衝區才執行i/o操作。典型的代表是磁碟的讀寫。

由於輸出函式是行緩衝型別的。所以我們需要使用緩衝區重新整理函式fflush來輸出。否則我們看到的進度條將是一段一段輸出的。

補充:printf函式是乙個行緩衝函式,先寫到緩衝區,滿足條件就將緩衝區刷到對應檔案中。滿足下列條件之一,緩衝區都會重新整理:

(1)緩衝區填滿

(2)寫入的字元中有'\n''\r'

(3)呼叫fflush重新整理緩衝區

(4)呼叫scanf從緩衝區獲取資料時,也會重新整理新緩衝區。

換行符

有兩個符號需要區分:'\n''\r'。他們有不同的含義。**'\n'表示的是換行,將游標指向下一行的開頭位置。』`r』指的是回車,將游標回到當前行的開頭位置。**在這裡我們要使用『\r』,否則我們的進度條將輸出乙個『#』`就換一行。

usleep函式

重新整理了緩衝區之後,如果並沒有加上睡眠函式,結果將一次性輸出來。進度條應該是隨著載入不停出現才對。

這裡統一總結一下linux睡眠函式:

標頭檔案:#include

為單位:unsigned int sleep( unsigned int seconds );

微秒為單位:int usleep ( useconds_t usec );

四分之一毫秒為單位:extern void delay( unsigned int msec );

以睡眠一秒為例:

sleep(1); usleep(1000 000); delay(250);

輸出顏色的設定

printf函式可以通過輸出特定的轉義序列來實現輸出字元的顏色和狀態。

轉義序列以控制字元』esc』開頭。該字元的ascii碼十進位制表示為27,十六進製制表示為0x1b,八進位制表示為033。多數轉義序列超過兩個字元,故通常以』esc』和左括號』[『開頭。該起始序列稱為控制序列引導符(csi,control sequence intro),通常由』\033[『或』\e[『代替。

一般格式如下:(顯示方式指的是樣式,前景色是30+顏色值,背景色是40+顏色值,字元m表示結束)

\033[顯示方式;前景色;背景色m + 輸出字串

或者\e[顯示方式;前景色;背景色m + 輸出字串

常見引數如下:

顯示方式:0(預設)、1(粗體/高亮)、22(非粗體)、4(單條下劃線)、24(無下劃線)、5(閃爍)、25(無閃爍)、7(反顯、翻轉前景色和背景色)、27(無反顯)

顏色:0(黑)、1(紅)、2(綠)、 3(黃)、4(藍)、5(洋紅)、6(青)、7(白)

見例子:

printf("\033[31mhello!\n\033[0m");

printf("\033[4;32mhello!\n\033[0m");

printf("\033[1;34;43mhello!\n\033[0m");

其中:\033[0m用於恢復預設的終端輸出屬性,否則會影響後續的輸出。

顏色設定詳細解析傳送門

**如下

#include 

#include

#include

int main();

//設定狀態,顯示此時正在載入

const

char *status = "|/-\\";

memset(bar, 0, siezof(bar));

while(i <= 100)

//休眠0.03秒輸出字元

usleep(30000);

}printf("\n");

return

0;}

參考一參考二

Linux下彩色進度條

回車與換行 緩衝區概念 乙個緩衝區物件是固定數量的資料的容器,其作用是乙個儲存器 記憶體 或者分段運輸區,在這裡資料可被儲存並在之後用於檢索。緩衝區可分為 全緩衝,行緩衝,不帶緩衝 全緩衝 當填滿標準io的快取後才進行實際io操作。windows和linux都可以通過給 mode設為 iofbf設定...

Linux下彩色進度條的實現

在linux下安裝軟體的過程中會出現乙個進度條,它通過動態增加一些符號來表示安裝進度。今天我們就來模擬實現一下乙個進度條。在實現進度條之前,首先需要了解一些概念。一.緩衝區 緩衝區分為三種 無緩衝,行緩衝和全緩衝。無緩衝 指沒有緩衝,立即顯示資訊。行緩衝 輸入輸出遇到換行符才進行io操作。全緩衝 輸...

Linux下彩色進度條的實現

實現乙個彩色進度條的前提是要了解linux下如何改變shell的輸出顏色,shell的輸出顏色改變是通過轉義序列完成的。多數轉義序列以控制字元 esc 和左中括號 開頭。該起始序列稱為控制序列引導符,通常由 033 或 e 代替 通過轉義序列設定終端顯示屬性時,採用以下格式 033 屬性m 或 e ...