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

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

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

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

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

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

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

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

HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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