例如输出是 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
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;
}
};
上次我不得不这样做(回到恐龙在地球上漫游并且牛仔布很酷的时候),我们使用了Curses。
您可以存储所需的所有输出,并在每次更改值时重新绘制整个控制台窗口。在 Linux 上不知道,但在 Windows 上,您可以使用以下命令清除控制台:
system("cls");