linux终端的进度条

时间:2012-10-25 13:50:15

标签: c++ shell pipe

我最近在C ++中实现了一个进度条类。我写了像

这样的东西
cout << "\r" << percentage_done << "%" << flush;

现在我正在运行一些程序将输出管道化为less。 问题是较少显示了很多类型

的行

^ M1%^ M2%...

所以&#34; \ r&#34;没有正确解释。是否有可能以这种方式管道 较少只会显示最终的100%行或我必须添加一个开关到我的程序 完全禁用进度条?

当我将输出直接传输到文件时,我有同样的问题,所以输出文件 不必要地占用大量磁盘空间。

3 个答案:

答案 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);
}

根据返回值,我是否打印进度条。现在一切都很顺利:))