在實現彩色彩色進度條的過程中,我們先來了解一下相關的知識,這樣才能幫助我們更好的實現進度條。
一、相關背景
在linux下安裝檔案都會有乙個進度條來提示我們安裝的進度,它裡面會動態增長的乙個影象表示進度,同時還有百分數表示安裝百分比等等資訊。
二、緩衝區的相關知識
一般c庫函式寫入檔案是全緩衝方式,而寫入顯示器是行緩衝方式,printf、fwrite庫函式會自帶緩衝區,而我們只要達到了一種緩衝方式我們就可以重新整理緩衝區,一般情況下我們有以下緩衝方式:
如果我們沒有遇到回車換行符,緩衝區不會立刻將資料顯示出來,而是進入sleep函式中,實際上最新執行的仍然是sleep之前的程式,因為沒有\n出現,所以資料先會被放在緩衝區中,所以我們需要用fflush強制重新整理緩衝區。
三、顏色的實現
顏色的實現很簡單我們只需要在需要顯示顏色的部分輸入顏色的編號即可,但是最重要的是我們需要在最後用\033[0m關閉所有屬性,不然程式執行後會在執行後的後續文字中也變為你所設定的顏色,但是如果用ls命令,你會發現顏色由恢復原來的樣子,因為ls命令有內建的\033[0m**來關閉所以屬性。
顏色的實現主要通過控制符來進行實現,常見的控制符如下所示:
含義\033[0m
關閉所有屬性
\033[1m
設定高亮度
\033[4m
下劃線\033[5m
閃爍\033[7m
反顯\033[8m
消隱\033[30m– \033[37m
設定前景色
\033[40m– \033[47m
設定背景色
\033[na
游標上移n行
\033[nb
游標下移n行
\033[nc
游標右移n列
\033[nd
游標左移n列
\033[y; h
設定游標位置
\033[2j
清屏\033[k
清除從游標到行尾的內容
\033[s
儲存游標位置
\033[u
恢復游標位置
\033[? 25l
隱藏游標
\033[? 25h
顯示光顯示游標
前背景色的**
含義30
黑色31
紅色32
綠色33
黃色34
藍色35
紫色36
深綠色37
白色背景色的**
含義40
黑色41
深紅色42
綠色43
黃色44
藍色45
紫色46
深綠色47
白色四、\r和\n的區別
\r表示的是回車,是游標回到最開始的位置,而\n表示的是換行,換到下一行,游標回到下一行最開始的位置,在實現進度條的過程中,需要的是\r。
五、**的實現
用一區間存放#號影象,由於我們用陣列存放』#』號,從0到100一共有101個,但是還需要在最後加上乙個』\0』表示結束,所以一共有102個空間,同時如果我們要實現乙個旋轉的圈圈所以包含了「|/-\」四個字元,所以還需要乙個陣列存放這些字元。
我們用乙個while()裡面輸出這些資訊即可完成進度條的實現,但是需要注意的是,我們需要的是行緩衝模式,所以我們在printf的最後加上\r表達換行,如果不加上這個則不會重新整理,每次都輸出一行,最後我們用fflush強制輸出緩衝區的內容即可達到目的。
由於在linux下usleep是按照毫秒計算的,這點和windows下不一樣,所以我們定下了10000的數值。
函式名: usleep
標頭檔案: #include
功 能: usleep功能把程序掛起一段時間, 單位是微秒(百萬分之一秒);
語 法: void usleep(int micro_seconds);
返回值: 無
內容說明:本函式可暫時使程式停止執行。引數 micro_seconds 為要暫停的微秒數(us)。
注 意:
這個函式不能工作在windows 作業系統中。用在linux的測試環境下面。
參 見:usleep() 與sleep()類似,用於延遲掛起程序。程序被掛起放到reday queue。
是一般情況下,延遲時間數量級是秒的時候,盡可能使用sleep()函式。
如果延遲時間為幾十毫秒(1ms = 1000us),或者更小,盡可能使用usleep()函式。這樣才能最佳的利用cpu時間
時鐘換算:
微秒,時間單位,符號us(英語:microsecond ).
1微秒等於百萬分之一秒(10的負6 次方秒)
0.000 001 微秒 = 1皮秒
0.001 微秒 = 1納秒
1,000 微秒 = 1毫秒
1,000,000 微秒 = 1秒
1s = 1000ms
1ms = 1000μs
1μs = 1000ns
1ns = 1000ps
1秒(s) = 1000 毫秒(ms) = 1,000,000 微秒(μs) = 1,000,000,000 納秒(ns) = 1,000,000,000,000 皮秒(ps)
memset()函式
原型是extern void *memset(void *buffer, int c, int count) ; buffer:為指標或是陣列,
c:是賦給buffer的值,count:是buffer的長度.
這個函式在socket中多用於清空陣列.如:原型是memset(buffer, 0, sizeof(buffer))
memset
用來對一段記憶體空間全部設定為某個字元,一般用在對定義的字串進行初始化為『 』或『/0』;
例:char a[100];memset(a, '/0', sizeof(a));memset可以方便的清空乙個結構型別的變數或陣列。
六、**實現過程
Linux下彩色進度條
回車與換行 緩衝區概念 乙個緩衝區物件是固定數量的資料的容器,其作用是乙個儲存器 記憶體 或者分段運輸區,在這裡資料可被儲存並在之後用於檢索。緩衝區可分為 全緩衝,行緩衝,不帶緩衝 全緩衝 當填滿標準io的快取後才進行實際io操作。windows和linux都可以通過給 mode設為 iofbf設定...
Linux下簡易彩色進度條
個人部落格傳送門 前言在linux下安裝檔案的時候,都會有個進度條來提示我們安裝的進度是多少。這裡我們模擬輸出這個進度條。主要用到輸出函式的操作 緩衝區的重新整理 usleep函式 linux終端顏色的顯示等知識。效果如下 鋪墊知識點 緩衝區 緩衝區分位三種 無緩衝,行緩衝,全緩衝。無緩衝 沒有緩衝...
Linux 簡易小程式 進度條
進度條即計算機在處理任務時以形式顯示處理任務的速度,完成度,剩餘未完成任務量的大小,和可能需要處理時間,一般以長方形條狀顯示。理解 要實現進度條,就要在緩衝區裡,所以,我們需要注意幾點 1.緩衝區 分為 無緩衝,行緩衝,全緩衝 無緩衝,是指沒有緩衝,可以將資訊立馬顯示出來。具體代表是標準錯誤流std...