linux终端中的进度条 我最近在C++中实现了进度条类。我写了这样的东西 cout << "\r" << percentage_done << "%" << flush; cout

linux终端中的进度条 我最近在C++中实现了进度条类。我写了这样的东西 cout << "\r" << percentage_done << "%" << flush; cout,c++,shell,pipe,C++,Shell,Pipe,使用-r选项less来解释控制序列。比较: echo -e '1\r2\r3\r4\r100' | less echo -e '1\r2\r3\r4\r100' | less -r 工作正常,管道较少,无需额外选项。它通常适用于任何类型的输出重定向 您不必按照其他方法的建议检查is_终端: #include <boost/progress.hpp> #include <boost/timer.hpp> #include <vector> int main(

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

echo -e '1\r2\r3\r4\r100' | less
echo -e '1\r2\r3\r4\r100' | less -r
工作正常,管道较少,无需额外选项。它通常适用于任何类型的输出重定向

您不必按照其他方法的建议检查is_终端:

#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;
}
标尺在显示CONSTRUCTOR的过程中打印


然后进度条在++显示进度时逐渐填充*

嗯,我认为扬·胡德克说的很对。我给自己写了一个小函数

#include <unistd.h>

bool stdout_has_terminal()
{
  return NULL != ttyname(STDOUT_FILENO);
}
#包括
bool stdout_有_终端()
{
返回NULL!=ttyname(STDOUT\u FILENO);
}

根据返回值,我可以打印进度条,也可以不打印。现在一切都运行得很好:)

有一个选项可以关闭奇特的基于文本的GUI,这是一种习惯做法。此外,您最好使用libncurses进行统一的终端访问。一切都按设计进行。仅当终端连接到标准输出时,才应显示进度条。
“\r”
在大多数系统上映射到
^M
-回车,或返回到行首而不前进到下一行(不同于
”\n”
,换行符,表示移动到下一行的开头或向下移动一行而不更改列);所以你得到了你想要的。正如其他人提到的,如果
cout
不是终端,您可能需要使用不同的格式。
#include <unistd.h>

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