Блог пользователя agul

Автор agul, 14 лет назад, По-русски

Можно ли как-нибудь удалить символы, выведенные в консоль, а вместо них что-нибудь записать?

Например, интересно, как сделано обновление данных о времени и памяти в тестере Тимуса (http://acm.timus.ru/tester/).

P.S. Интересуют решения только на C++ и только для Windows.

  • Проголосовать: нравится
  • +2
  • Проголосовать: не нравится

»
14 лет назад, скрыть # |
 
Проголосовать: нравится +11 Проголосовать: не нравится

Можно получить хэндл консоли. Например так:

HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);

А потом пользоваться разными функциями.

  • »
    »
    14 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится

    А стирать как-нибудь можно? Или каждый раз переписывать все данные консоли только?

    • »
      »
      »
      14 лет назад, скрыть # ^ |
       
      Проголосовать: нравится +3 Проголосовать: не нравится

      "переписывать все данные"

      Нет не все. Только те, что хочешь. Тебе подойдут функции FillConsoleOutputCharacter и SetConsoleCursorPosition + cout << " ".

      P.S. Я тоже предлагаю воспользоваться ссылкой от it4.kp ;-)

      • »
        »
        »
        »
        14 лет назад, скрыть # ^ |
         
        Проголосовать: нравится 0 Проголосовать: не нравится

        Спасибо! FillConsoleOutputCharacter в итоге не понадобилась даже.

        Достаточно просто передвинуть позицию курсора.

»
14 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

В пределах одной строки можно воспользоваться управляющими символами \b и \r, которые переводят курсор, соответственно, на одну позицию назад и в начало строки:

cout << "1234\r567\b8" << endl;
  • »
    »
    14 лет назад, скрыть # ^ |
    ← Rev. 2  
    Проголосовать: нравится 0 Проголосовать: не нравится

    Нужно было изменять данные уже после того, как они были выведены с помощью cout.

    Тут уже такие фишки, как \b и \r, не работают.

    • »
      »
      »
      14 лет назад, скрыть # ^ |
       
      Проголосовать: нравится +8 Проголосовать: не нравится

      То есть, следуя такой логике, этот код работать не должен?

      сout << "1234"  << flush;
      cout << "\r567" << flush;
      cout << "\b8"   << endl;
    • »
      »
      »
      14 лет назад, скрыть # ^ |
       
      Проголосовать: нравится 0 Проголосовать: не нравится

      Неверно, у меня под Win7 работает. Под XP, по-моему, я тоже это использовал.

      • »
        »
        »
        »
        14 лет назад, скрыть # ^ |
         
        Проголосовать: нравится 0 Проголосовать: не нравится

        А можешь код показать, где работает?

        Я ещё раз только что попробовал, не получилось.

        • »
          »
          »
          »
          »
          14 лет назад, скрыть # ^ |
           
          Проголосовать: нравится +3 Проголосовать: не нравится

          Щёлк. Компилирую, запускаю в консоли — выводит "456 — OK".

          • »
            »
            »
            »
            »
            »
            14 лет назад, скрыть # ^ |
             
            Проголосовать: нравится 0 Проголосовать: не нравится

            У меня выводится "456 — OK" (MSVC++ 2005)
            А вот на Codeforces в "запуске" http://codeforces.me/problemset/customtest выводит "123456 — OK" с любыми C++ компиляторами

            • »
              »
              »
              »
              »
              »
              »
              14 лет назад, скрыть # ^ |
               
              Проголосовать: нравится +14 Проголосовать: не нравится

              Надо понимать, что программа выводит все символы так, как есть — байт за байтом (исключение составляют переводы строки в текстовом режиме). Важно то, что находится с другой стороны: либо оно обработает специальные символы по-особенному, либо нет. Консоль/интерактивный терминал — обработают. Если стандартный вывод связан с файлом, то всё запишется как есть, без изменения. Если стандарный вывод через канал (_pipe_) читает другая программа ("запуск" наверняка работает так), то всё зависит от неё. В данном случае видим, что данные выводятся без изменения (\b и \r просто не видны на экране).

              В общем случае надо принимать, что то, что записано в cout, изменить нельзя.