2012-06-01 4 views
2

, например, выход а = 20 Я хочу, чтобы изменить количество «20» на другой номер и записать результат в том же месте первого вывода, а не в новой строке (самое раннее количество "а" не требуется только последний результат важен) Я стараюсь избегать что-то вроде этого:Как написать переменную в одном месте командного окна и обновить ее значение в одном месте?

выход:

a=20 
a=21 
a=70 
. 
. 
. 
+1

старой школы альтернативой может быть использование libcurses – Brady

ответ

6

Have у НУ попытался это:

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

Вы, вероятно, следует промыть его после каждой печати, как это: 'Е (" \ га =% d », а); fflush (stdout); ' – Brady

2

В последний раз, когда я должен был сделать это (назад, когда динозавры бродили по Земле и джинсовой было круто), мы использовали Curses.

+0

раньше, чем ледниковый период? – peaceman

+2

Я все еще ношу джинсы! :) – Brady

+0

@ Brady это выглядит довольно очевидно для меня: вы уже не круты. –

1

Вы можете хранить все необходимые вам выходы и повторно рисовать все окно консоли каждый раз при изменении значения. Понятия не имею на Linux, а на Windows, вы можете очистить консоль с:

system("cls"); 
+1

'system (" clear ")' для unix – smerlin

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; 
    } 
}; 
Смежные вопросы