簡體   English   中英

linux終端的進度條

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM