[英]Progress bar in a linux terminal
我最近在C ++中實現了一個進度條類。 我寫了類似的東西
cout << "\r" << percentage_done << "%" << flush;
現在我正在運行一些將輸出管道化為較少的程序。 問題是較少顯示了很多類型的行
^ M1%^ M2%...
所以“\\ r”沒有被正確解釋。 是否有可能以這樣的方式管道,即less只顯示最終的100%行,或者我是否必須在我的程序中添加一個開關以完全禁用進度條?
當我將輸出直接傳遞給文件時,我遇到了同樣的問題,因此輸出文件不必要地占用了大量磁盤空間。
如果沒有其他選項, 這種方法可以正常運行。 它通常適用於任何類型的輸出重定向。
而且您不必像其他方法那樣檢查is_terminal:
#include <boost/progress.hpp>
#include <boost/timer.hpp>
#include <vector>
int main(int argc,char *argv[])
{
const unsigned long expected_count=20;
boost::progress_display show_progress( expected_count );
for(int i=0;i!=expected_count;++i)
{
volatile std::vector<int> v(1024*1024*128);
++show_progress;
}
return 0;
}
輸出是:
0% 10 20 30 40 50 60 70 80 90 100%
|----|----|----|----|----|----|----|----|----|----|
***************************************************
在progress_display contstructor期間打印標尺。
然后進度條逐漸填充* on ++ show_progress;
使用-r
選項less
可以解釋控制序列。 相比:
echo -e '1\r2\r3\r4\r100' | less
echo -e '1\r2\r3\r4\r100' | less -r
好吧,我認為Jan Hudec所說的是對的。 我給自己寫了一個小函數
#include <unistd.h>
bool stdout_has_terminal()
{
return NULL != ttyname(STDOUT_FILENO);
}
根據返回值,我是否打印進度條。 現在一切都很好:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.