Linu實現簡單進度條小程式(彩色版)
在實現進度條小程式之前,我們先來看兩段小程式碼
test.c
#include<stdio.h>
int main()
{
printf("hello bit\n");
sleep(3);
return 0;
}
test1.c
#include<stdio.h>
int main()
{
printf("hello bit");
sleep(3);
return 0;
}
兩個函式唯一的不同在於第一個printf裡面多了一個\n
執行兩個程式,我們可以觀察到,test.c先列印hello bit ,然後誰3秒,而test1,先睡3秒,然後列印hello bit.
那麼問題就來了,為什麼會出現這種情況呢,printf肯定是先於sleep執行的,為什麼最後才顯示出來,這就引出了快取區的問題,printf在列印時,並不是直接將結果輸出到顯示器上,而是將結果儲存在快取區。
第一個程式之所以先列印,是因為有一個\n,也就是所謂的換行,因為printf函式是一個行緩衝機制,它遇到\n後就會將緩衝區的內容重新整理到顯示屏上。
瞭解了printf函式的行緩衝機制,那麼接下來我們就嘗試來寫一個進度條函式。
#include <stdio.h> 2 #include<string.h> 3 int main() 4 { 5 int i = 0; 6 char a[102];//由於陣列包含兩個[]所以陣列大小是102 7 memset(a, 0, sizeof(a)); 8 char* label = "|/-\\";//這裡是來列印後面的提示。 9 while(i<=100) 10 { 11 a[i] ='#'; 12 printf("[%-100s] [%d%%] %c \r", a, i,label[i%4]); //這裡的[-100s]是將[]置於兩端,'-'是進行左對齊 13 i++; fflush(stdout);//重新整理緩衝區,不然#的列印是一段一段的 15 usleep(100000); 16 } 17 printf("\n"); 18 return 0; 19 }
實現完簡單的進度條的程式碼後,我們是不是可以實現給進度調小程式加上顏色內。
在實現之前,我們先來了解一下,Linux下printf輸出字串的顏色
基本列印格式:
printf("\033[字背景顏色;字型顏色m字串\033[0m" );
printf("\033[41;32m字型背景是紅色,字是綠色\033[0m\n");
41是字背景顏色, 32是字型的顏色, 字型背景是紅色,字是綠色是要輸出的字串. 後面的\033 …\033[0m是配對的為控制碼。
先來說一下顏色和背景的程式碼
顏色程式碼:
QUOTE:
字背景顏色範圍: 40–49 字顏色: 30–39
40: 黑 30: 黑
41: 紅 31: 紅
42: 綠 32: 綠
43: 黃 33: 黃
44: 藍 34: 藍
45: 紫 35: 紫
46: 深綠 36: 深綠
47: 白色 37: 白色
注意到總體範圍是從30到49,在printf("\033[41;32m字型背景是紅色,字是綠色\033[0m\n");中\033[41;32m是可以單獨只指定背景顏色或者字型顏色的,這樣另外的部分就是預設狀態如\033[32m 表示字型是綠色背景預設而\033[41m 表示背景為紅色字型預設。
所以我們可以通過設定字串的背景顏色和顏色來實現輸出效果控制。
1 #include <stdio.h>
2 #include<string.h>
3 int main()
4 {
5 int i = 0;
6 char a[102];
7 memset(a, 0, sizeof(a));
8 char* label = "|/-\\";
9 while(i<=100)
10 {
11 a[i] = ' ';
12 printf("\033[37;44m[%s]\033[0m [%d%%] %c \r", a, i, label[i%4]);
13 i++;
14 fflush(stdout);
15 usleep(100000);
16 }
17 printf("\n");
18 return 0;
19 }
~