Можно ли как-нибудь удалить символы, выведенные в консоль, а вместо них что-нибудь записать?
Например, интересно, как сделано обновление данных о времени и памяти в тестере Тимуса (http://acm.timus.ru/tester/).
P.S. Интересуют решения только на C++ и только для Windows.
Можно получить хэндл консоли. Например так:
А потом пользоваться разными функциями.
А стирать как-нибудь можно? Или каждый раз переписывать все данные консоли только?
Нет не все. Только те, что хочешь. Тебе подойдут функции FillConsoleOutputCharacter и SetConsoleCursorPosition + cout << " ".
P.S. Я тоже предлагаю воспользоваться ссылкой от it4.kp ;-)
Спасибо!
FillConsoleOutputCharacter
в итоге не понадобилась даже.Достаточно просто передвинуть позицию курсора.
В пределах одной строки можно воспользоваться управляющими символами
\b
и\r
, которые переводят курсор, соответственно, на одну позицию назад и в начало строки:Нужно было изменять данные уже после того, как они были выведены с помощью
cout
.Тут уже такие фишки, как
\b
и\r
, не работают.То есть, следуя такой логике, этот код работать не должен?
Неверно, у меня под Win7 работает. Под XP, по-моему, я тоже это использовал.
А можешь код показать, где работает?
Я ещё раз только что попробовал, не получилось.
Щёлк. Компилирую, запускаю в консоли — выводит "456 — OK".
У меня выводится "456 — OK" (MSVC++ 2005)
А вот на Codeforces в "запуске" http://mirror.codeforces.com/problemset/customtest выводит "123456 — OK" с любыми C++ компиляторами
Надо понимать, что программа выводит все символы так, как есть — байт за байтом (исключение составляют переводы строки в текстовом режиме). Важно то, что находится с другой стороны: либо оно обработает специальные символы по-особенному, либо нет. Консоль/интерактивный терминал — обработают. Если стандартный вывод связан с файлом, то всё запишется как есть, без изменения. Если стандарный вывод через канал (_pipe_) читает другая программа ("запуск" наверняка работает так), то всё зависит от неё. В данном случае видим, что данные выводятся без изменения (
\b
и\r
просто не видны на экране).В общем случае надо принимать, что то, что записано в
cout
, изменить нельзя.