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

wherexxx是一个不断演变的值,您可以输出没有 a '\n'(或 astd::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 回答