Формально общее решение потребовало бы что-то вроде 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;
}
};
старой школы альтернативой может быть использование libcurses – Brady