我最近在C ++中实现了一个进度条类。我写了像
这样的东西cout << "\r" << percentage_done << "%" << flush;
现在我正在运行一些程序将输出管道化为less。 问题是较少显示了很多类型
的行^ M1%^ M2%...
所以&#34; \ r&#34;没有正确解释。是否有可能以这种方式管道 较少只会显示最终的100%行或我必须添加一个开关到我的程序 完全禁用进度条?
当我将输出直接传输到文件时,我有同样的问题,所以输出文件 不必要地占用大量磁盘空间。
答案 0 :(得分:6)
This approach无需其他选项即可正常运行。它通常适用于任何类型的输出重定向。
您不必按照其他方法的建议检查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期间打印标尺。
然后进度条逐渐被++ show_progress上的 * 填充;
答案 1 :(得分:2)
使用-r
less
选项让它解释控制序列。比较:
echo -e '1\r2\r3\r4\r100' | less
echo -e '1\r2\r3\r4\r100' | less -r
答案 2 :(得分:0)
嗯,我认为Jan Hudec所说的是对的。我给自己写了一个小函数
#include <unistd.h>
bool stdout_has_terminal()
{
return NULL != ttyname(STDOUT_FILENO);
}
根据返回值,我是否打印进度条。现在一切都很顺利:))