實現一個簡單的進度條


   我們平常在下載軟件或者安裝軟件時都會看到進度條,下面我們分析一下,並實現一個簡易的進度條

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
 執行完之后記得清理解決方案

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM