У меня есть консольное приложение, которое должно отображать состояние элементов, но вместо того, чтобы прокручивать текст как сумасшедший, я бы предпочел, чтобы текущий статус продолжал отображаться в тех же строках. Для примера:
Running... nn% completeBuffer size: bbbb bytes
должен быть выводом, где «nn» - текущий процент завершения, а «bbbb» - размер буфера, который периодически обновляется в одних и тех же строках консоли.
Первый подход, который я использовал, просто напечатал правильное количество обратных пробелов на консоли перед печатью нового состояния, но у него есть неприятное мерцание, от которого я хочу избавиться. Я также хочу придерживаться либо стандартной библиотеки, либо функциональности, предоставляемой MS (VC 8), чтобы не вводить другую зависимость для этой простой потребности.





В Linux это можно сделать, напечатав \ b и / или \ r в stderr. Возможно, вам придется поэкспериментировать, чтобы найти правильную комбинацию вещей в Windows.
Если вы печатаете с использованием \ r и не используете функцию, которая генерирует новую строку или добавляет \ n в конец, курсор вернется в начало строки и просто напечатает следующее, что вы вставите. Создание полной строки перед печатью также может уменьшить мерцание.
ОБНОВИТЬ: Вопрос был изменен на 2 строки вывода вместо 1, что делает мой ответ неполным. Вероятно, потребуется более сложный подход. У JP правильная идея с Консольный API. Я считаю, что следующий сайт подробно описывает многие вещи, которые вам понадобятся для достижения вашей цели. На сайте также упоминается, что ключом к уменьшению мерцания является отображение всего за кадром перед его отображением. Это верно всякий раз, когда вы отображаете что-либо на экране, будь то текст или графика (2D или 3D).
Вы можете использовать SetConsoleCursorPosition. Вам нужно будет вызвать GetStdHandle, чтобы получить дескриптор выходного буфера.
Если предложение Джозефа не дает вам достаточной гибкости, взгляните на API консоли: http://msdn.microsoft.com/en-us/library/ms682073(VS.85).aspx.
Джозеф, JP и CodingTheWheel оказали ценную помощь.
В моем простом случае наиболее простой подход, казалось, был основан на Ответ CodingTheWheel:
// before entering update loop
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO bufferInfo;
GetConsoleScreenBufferInfo(h, &bufferInfo);
// update loop
while (updating)
{
// reset the cursor position to where it was each time
SetConsoleCursorPosition(h, bufferInfo.dwCursorPosition);
//...
// insert combinations of sprintf, printf, etc. here
//...
}
Для более сложных проблем полный консольный API, предоставляемый Ответ JP, в координации с примерами, предоставленными через связь из Ответ Иосифа, может оказаться полезным, но я нашел работу, необходимую для использования CHAR_INFO, слишком утомительной для такого простого приложения.
Подробнее см. В моем ответе, но для моего простого случая это был самый простой подход.