如何在命令窗口的某个位置编写变量并在同一位置更新其值?

时间:2012-06-01 09:01:42

标签: c++ gcc printing

例如输出为 a = 20 我想将数字“20”更改为另一个数字并将结果写入第一个输出的相同位置,而不是新行(“a”的最早数量不需要最后一个结果很重要) 我尽量避免这样的事情:

输出:

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

4 个答案:

答案 0 :(得分:6)

你试过这个:

printf("\ra=%d",a);
// \r=carriage return, returns the cursor to the beginning of current line

答案 1 :(得分: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;
    }
};

答案 2 :(得分:2)

我最后一次这样做(当恐龙在地球上漫游而牛仔布很酷的时候回来),我们使用了Curses

答案 3 :(得分:1)

您可以存储所需的所有输出,并在每次更改值时重新绘制整个控制台窗口。不知道在Linux上,但在Windows上你可以通过以下方式清除控制台:

system("cls");