2014-01-06 94 views
15

許多命令行工具都實現了基於文本的進度條。像RPM安裝:如何使用printf製作「進度條」?

安裝############## [45%]

#的生長與所述百分比,而保持自身在單行。我想要的是類似的東西:我需要一個進度指示器,只需一行,也就是說,當百分比增長時,它會被覆蓋,而不是創建新行(\n)。

我嘗試這樣做:

#include <stdio.h> 

    int main(){ 
     int i = 0; 
     for (i = 0; i < 10000; i++){ 
      printf("\rIn progress %d", i/100); 
     } 
     printf("\n"); 
    } 

\r工作覆蓋一行。但是,\r會將光標移至行的開頭,並且printf會將光標移至末尾,這會導致光標快速移動。你們可以通過一些編輯來感受它。任何人都可以想出替代方案來避免這個問題?

回答

8

這是緩衝的stdout流的問題。你必須明確地刷新它的printf()後使用fflush(stdout)(用\n時隱沖洗):

fflush(stdout); 
+1

謝謝!它工作正常。其實我對緩衝流有一點概念,你能否提供一些解釋或進一步參考? – qweruiop

1

我相信使用

printf("\e[?25l"); 

也許能夠有所幫助。這會隱藏光標。老實說,我不確定再次使用/ r或printf是否會覆蓋那段代碼並顯示光標,但是值得一試。另外,下面的代碼可以用來再次顯示光標。

printf("\e[?25h"); 
2

下面是rpm如何做,也許你可以爲自己的目的寫一個類似的文件:printHash

rpm使用\b而不是\r來逐個字符地擦除輸出行。

1

與其給您的一些錯誤和不可移植的代碼行,我建議您閱讀系統的termcapterminfo的手冊頁。起初有點難,但是如果你要開始使用終端相關的代碼,那麼這是一個必須閱讀的內容。維基百科頁面是一個很好的開始的地方,但是也可以讓系統上的手冊頁也被讀取。

此外,我剛剛意識到你的問題是絕對的duplicate其他一些問題。

+0

感謝您的信息。我會感謝所有指導我學習一些我不知道的重要科目的人。 – qweruiop