2

最近、プログレス バー クラスを C++ で実装しました。のようなものを書きました

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

現在、出力をlessにパイプするいくつかのプログラムを実行しています。問題は、あまり多くのタイプの行が表示されないことです

^M1%^M2%...

したがって、「\r」は正しく解釈されません。less が最後の 100% 行のみを表示するようにこれをパイプすることは可能ですか、それともプログレス バーを完全に無効にするためにプログラムにスイッチを追加する必要がありますか?

出力をファイルに直接パイプするときにも同じ問題が発生するため、出力ファイルが不必要に多くのディスク領域を占有します。

4

3 に答える 3

6

このアプローチは、追加のオプションがなくても、less でパイプしても問題なく機能します。また、一般的に、あらゆる種類の出力リダイレクトで機能します。

また、他のアプローチで提案されているように 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

さて、ジャン・ヒューデックが言ったことはまったく正しかったと思います。私は自分自身に小さな関数を書きました

#include <unistd.h>

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

戻り値に応じて、プログレッションバーを印刷するかどうかを選択します。今ではすべてが非常にうまく機能します:)

于 2012-10-25T18:38:23.900 に答える