たとえば、出力は a = 20です。数値「20」を別の数値に変更し、結果を最初の出力の同じ場所に書き込みます。新しい行ではありません( 「a」の最初の量は必要ありません。最後の結果は重要です)私はこのようなことを避けようとします:
出力:
a=20
a=21
a=70
.
.
.
これを試しましたか:
printf("\ra=%d",a);
// \r=carriage return, returns the cursor to the beginning of current line
正式には、一般的なソリューションには、のようなものが必要ですncurses
。実際には、あなたが探しているのが次のような行を持つことだけである場合:
a = xxx
xxx
絶えず進化する値はどこにありますか、 '\n'
(またはのstd::flush
代わりにstd::endl
)なしで行を出力できます。更新するに\b
は、数字の先頭に戻るのに十分な文字を出力するだけです。何かのようなもの:
std::cout << "label = 000" << std::flush;
while ( ... ) {
// ...
if ( timeToUpdate ) {
std::cout << "\b\b\b" << std::setw(3) << number << std::flush;
}
}
これは、固定幅のフォーマットを想定しています(私の例では、999より大きい値はありません)。可変幅の場合、次に出力する必要があるバックスペースの数を決定するために、最初にstd::ostringstreamにフォーマットできます。これには特別なカウンタータイプを使用します。
class DisplayedCounter
{
int myBackslashCount;
int myCurrentValue;
public:
DisplayedCounter()
: myBackslashCount(0)
, myCurrentValue(0)
{
}
// Functions to evolve the current value...
// Could be no more than an operator=( int )
friend std::ostream& operator<<(
std::ostream& dest,
DisplayedCounter const& source )
{
dest << std::string( myBackslashCount, '\b' );
std::ostringstream tmp;
tmp << myCurrentValue;
myBackslashCount = tmp.str().size();
dest << tmp.str() << std::flush();
return dest;
}
};
私がこれを最後にやらなければならなかったとき(恐竜が地球を歩き回り、デニムが涼しかったとき)、私たちはCursesを使用しました。
必要なすべての出力を保存し、値が変更されるたびにコンソールウィンドウ全体を再描画できます。Linuxではわかりませんが、Windowsでは次の方法でコンソールをクリアできます。
system("cls");