1. 程式人生 > >C/C++ 在控制檯下顯示進度條

C/C++ 在控制檯下顯示進度條

當程式在進行大量的運算或IO操作時,常常需要耗很長時間,為了不讓使用者有一個乏味的等待或是錯誤的認為系統已經宕機,有必要給程式新增進度提示功能。在視窗介面中要顯示進度條和顯示完成百分比是非常容易的,但如何在控制檯下去完成這個任務了?一行一行的輸出當前完成百分比肯定是不夠美觀的,最好能“原地踏步”一樣的顯示即舊的數字會被新的數字完全覆蓋。其實這個是很容易的,下面先給出的示例程式碼,稍後再進行講解。

  1. //在控制檯下顯示進度
  2. #include <stdio.h>
  3. #include <windows.h>
  4. int main()  
  5. {  
  6.     constint NUM  = 50;
    //任務完成總量
  7.     for (int i = 0; i < NUM; i++)  
  8.     {  
  9.         //用Sleep()來代替一些費時的操作,如讀寫檔案,大量的運算。
  10.         Sleep(200); //some work to do
  11.         //輸出百分比
  12.         printf("%.2lf%%\r", i * 100.0/ NUM);  
  13.     }  
  14.     return 0;  
  15. }  

可以看出,關鍵是在於\r書上說它是轉義字元中的回車符——描述的不是很到位。準確的講應該是回到本行開始處。

如:printf("123\r100\n");會輸出100。printf("12345\r100\n");會輸出10045。

來個複雜點的例子:

  1. #include <stdio.h>
  2. int main()  
  3. {  
  4.     printf("MoreWindows");  
  5.     printf("12345\r00\n");  
  6.     return 0;  
  7. }  

會輸出什麼了?

第一條語句輸出MoreWindows,第二條語句輸出12345後回到本行的開始處再輸出00並換行。這樣最開始的二個字元將會被覆蓋從而輸出00reWindows12345。

再來看一個例子,如下程式執行後將不會輸出任何內容。

  1. <span style="font-size:18px;">#include <stdio.h>  
  2. int main()  
  3. {  
  4.     printf("12345\r");  
  5.     return 0;  
  6. }</span>  

這是因為上面程式輸出和清除之間間隔時間太小,人眼無法察覺。下面這個程式將會讓你看清printf()函式執行\r的過程。

  1. #include <stdio.h>
  2. #include <windows.h>
  3. int main()  
  4. {  
  5.     char szText[] = "MoreWindows";  
  6.     printf("12345679\r");  
  7.     Sleep(2000);  
  8.     for (int i = 0; i < strlen(szText); i++)  
  9.     {  
  10.         putchar(szText[i]);  
  11.         Sleep(200);  
  12.     }  
  13.     putchar('\n');  
  14. }  

執行後將會看到輸出123456789後,游標移到了本行行首並會在1下面閃爍,閃爍時123456789仍在顯示螢幕上,2秒後,螢幕將輸出依次輸出MoreWindows並將原來的123456789覆蓋。

結語:在控制檯顯示進度無疑是非常方便的,在很多場合完全可以代替視窗進度條的來美化程式和減小使用者等待時的乏味感。