1. 程式人生 > >Linu實現簡單進度條小程式(彩色版)

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 }
~                  

在這裡插入圖片描述