關於進度條的實現,主要把握點就是動態修改,且是行內緩沖更新。
關於這點就需要了解printf()的行緩沖問題了
可以做如下驗證
#include <stdio.h> #include <stdlib.h> int main() { // printf("test"); case1:3秒後輸出 printf("test\n"); //case2:立即輸出 sleep(3); return 0; }
兩個case的區別就在於\n了,所以問題的症結之處就是\n了.
printf是一個行緩沖函數,先寫到緩沖區,滿足條件後,才將緩沖區刷到對應文件中,刷緩沖區的條件如下:
1 緩沖區填滿。
2 寫入的字符中有‘\n’, '\r'。
3 調用fflush手動刷新緩沖區。
4 調用scanf要從緩沖區中讀取數據時,也會將緩沖區內的數據刷新。
滿足上面4個條件之一緩沖區就會刷新,也就是printf會真正調用write來寫入。
當我們執行printf的進程或者線程結束的時候會主動調用flush來刷新緩沖區,所以程序結束,也會刷新。
對於以上幾點,都是很容易進行驗證的,這裡就不分開談論了
關於進度條。
有了行緩沖問題的了解,那麼我們就可以把握主更新緩沖的時機以及方式了。
進度條前進時更新緩沖重新寫入,方法的話就是\r了。因為我們的進度條是行 行為了
代碼實現
#include <stdio.h> #include <string.h> void proc() { int rate = 0; char bar[102]; memset(bar,'\0',sizeof(bar)); const char * flag = "|/-\\"; while(rate <= 100) { bar[rate] = '='; printf("[%-101s][%%%d][%c]\r",bar,rate,flag[rate%4]); fflush(stdout); rate ++; sleep(1); } } int main() { proc(); return 0; }
關於這個進度條問題,只是一個簡單的行緩沖了解以及簡短項目體驗而已。而實際項目中的進度條並非如此的。
個人的理解,揣摩:::因為實際程序中的進度條是需要切合工具,具體功能進度實現的。所以進度條的實現並不是一個時間軸上的有效動作。
比如文件壓縮,對於這個過程中的幾個點有相對的把控,然後以進度條作為一個伴隨進程,利用進程間關系(或者說觀察者模式),程序進行一步,報告給進度條程序前進一步。
做到真正的進度把握。
再比如網絡文件下載,首先:你可以確定讀取文件的准確大小,這時,就是根據網絡傳輸速率,文件傳輸比例進行更新跟進進度條程序。