我們平常在下載軟件或者安裝軟件時都會看到進度條,下面我們分析一下,並實現一個簡易的進度條
1、首先我們用[]固定在左右兩邊,中間預留空間,然后用'='進行填充在這里我們用"="表示1%,通過增加字符
來保證進度的增加。printf("[%-100s]\r",str); 格式化輸出。'-'表示左對齊 100表示列寬,'\r'表示回車,即每
次打印完使光標回到行首在這里需要解釋一下'\r'和'\n'這兩個概念
回車:'\r',表示回到當前行的行首
換行:'\n',表示光標進入下一行
2、加睡眠時間,如果不加睡眠時間,結果一下就全打印出來,那就不是進度條了。
linux下sleep時間單位為秒,這樣的話感覺間隔時間有點長,於是又有了usleep函數
我們可以通過man 來查看這連個函數:
3、在觀察程序輸出結果是會發現它是一段一段顯示,這和我們平常見到的
進度條不一樣。究其原因,發現是printf()的原因,,printf是先將要輸出的內容
寫到緩沖區里,然后再刷新。
現在來看一下UNIX里面關於標准IO的幾種緩沖機制:
<1>全緩沖:指的是系統在填滿標准IO緩沖區之后,才進行實際的IO操作
;磁盤上的文件通常由標准IO庫實施全緩沖
<2>行緩沖:標准IO在輸入輸出時遇到換行符(\n)的時候才將緩沖區的內容
寫入到標准輸入輸出的磁盤文件。注意:當流涉及到終端時
通常使用的是行緩沖
<3>無緩沖:指的是標准IO庫不對字符進行緩沖存儲,
注意:標准出錯流stderr通常是無緩沖。
printf()是一個行緩沖函數,先寫到緩沖區中,滿足刷新條件才將緩沖區的內容刷新到對應的文件中
,刷新緩沖區的條件如下:
(1)緩沖區已滿;
(2)遇到\n;
(3)調用ffush手動刷新緩沖區;
(4)調用scanf()從緩沖區讀取數據時,也會將緩沖區的數據刷新;
滿足上面的任意一個條件緩沖區就會刷新
代碼如下:
1 void Proc() 2 { 3 int rate = 0; 4 char str[102] = {0}; 5 const char* arr = "-\\|/"; 6 while(rate<=100) 7 { 8 str[rate]='='; 9 printf("[%-100s],%d%% ,[%c]\r",str,rate,arr[rate%4]) ; //%d%%d 打印百分比%%也可以用\%代替 10 rate++; 11 fflush(stdout); 12 usleep(1000000); 13 } 14 } 15 int main() 16 { 17 Proc(); 18 return 0; 19 }
效果展示:
4.最后補充一點,編寫Makefile文件
直接輸入make 就會生成Proc文件
執行程序命令 ./Proc
執行完之后記得清理解決方案