2

我最近用 C++ 实现了一个进度条类。我写了类似的东西

cout << "\r" << percentage_done << "%" << flush;

现在我正在运行一些程序,将输出输出到更少。问题是 less 向我展示了很多类型的行

^M1%^M2%...

所以“\r”没有被正确解释。是否可以通过这样一种方式进行管道传输,即 less 只会显示最后的 100% 行,或者我是否必须在我的程序中添加一个开关以完全禁用进度条?

当我将输出直接通过管道传输到文件时,我遇到了同样的问题,因此输出文件不必要地占用了大量磁盘空间。

4

3 回答 3

6

这种方法可以在没有额外选项的情况下使用更少的管道运行。它通常适用于任何类型的输出重定向。

而且您不必按照其他方法的建议检查 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 构造函数期间打印标尺。

然后在 ++show_progress 上,进度条逐渐被*填满;

于 2012-10-25T14:28:14.880 回答
2

使用-r选项less让它解释控制序列。比较:

echo -e '1\r2\r3\r4\r100' | less
echo -e '1\r2\r3\r4\r100' | less -r
于 2012-10-25T14:08:26.470 回答
0

嗯,我认为 Jan Hudec 说的非常正确。我给自己写了一个小函数

#include <unistd.h>

bool stdout_has_terminal()
{
  return NULL != ttyname(STDOUT_FILENO);
}

根据返回值,我要么打印进度条,要么不打印。现在一切都很好:)

于 2012-10-25T18:38:23.900 回答