2

たとえば、出力は a = 20です。数値「20」を別の数値に変更し、結果を最初の出力の同じ場所に書き込みます。新しい行ではありません( 「a」の最初の量は必要ありません。最後の結果は重要です)私はこのようなことを避けようとします:

出力:

a=20
a=21
a=70
.
.
.
4

4 に答える 4

6

これを試しましたか:

printf("\ra=%d",a);
// \r=carriage return, returns the cursor to the beginning of current line
于 2012-06-01T09:05:14.720 に答える
4

正式には、一般的なソリューションには、のようなものが必要です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;
    }
};
于 2012-06-01T09:13:32.460 に答える
2

私がこれを最後にやらなければならなかったとき(恐竜が地球を歩き回り、デニムが涼しかったとき)、私たちはCursesを使用しました。

于 2012-06-01T09:05:46.780 に答える
1

必要なすべての出力を保存し、値が変更されるたびにコンソールウィンドウ全体を再描画できます。Linuxではわかりませんが、Windowsでは次の方法でコンソールをクリアできます。

system("cls");
于 2012-06-01T09:11:21.470 に答える