Limpar a Consola em C++

Jinku Hu 12 outubro 2023
Limpar a Consola em C++

Este artigo irá explicar vários métodos de como limpar a consola em C++.

Utilizar os Códigos de Fuga ANSI para Limpar Consola

Não há características de linguagem C++ integradas para manipular a consola e limpar o texto de saída. No entanto, os códigos de fuga ANSI podem ser uma forma relativamente portátil de alcançar este objectivo. Os códigos de escape são sequências de bytes que começam com um carácter de escape ASCII e um carácter de parêntesis seguido de parâmetros. Estes caracteres podem ser inseridos na string de saída, e a consola interpreta-os como comandos em vez de texto a exibir.

Os códigos ANSI incluem múltiplas sequências de saída da consola com características como mover o cursor para cima/baixo, apagar em linha, rolar, e várias outras opções. O exemplo de código seguinte utiliza a sequência Erase in Display que limpa todo o ecrã e não elimina o buffer de scrollback. Note que construímos uma função separada chamada clear para tornar o código mais flexível e legível.

#include <iostream>

using std::cout;
using std::endl;

void Clear() { cout << "\x1B[2J\x1B[H"; }

int main() {
  cout << "Some console filling text ..." << endl;
  cout << "Another filler string for the stdout\n"
          "Another filler string for the stdout\n"
          "Another filler string for the stdout\n"
          "Another filler string for the stdout\n"
          "Another filler string for the stdout\n"
       << endl;
  Clear();

  return EXIT_SUCCESS;
}

Em alternativa, podemos inserir a mesma sequência de fuga com uma ligeira modificação (substituir 2 por 3) para limpar todo o ecrã da consola e apagar o buffer de retrocesso, como se mostra na próxima amostra de código. Algumas sequências de controlo ANSI úteis são descritas na tabela seguinte. Pode também consultar esta página da Wikipedia.

Código Nome Efeito
CSI n A Cursor Up Mover o cursor do terminal para cima por células n. O valor por defeito das células é 1. Se o cursor já estiver na borda, o comando de sequência não tem efeito.
CSI n B Cursor Down Mover o cursor do terminal para baixo por células n. O valor por defeito das células é 1. Se o cursor já estiver na borda, este comando de sequência não tem efeito.
CSI n J Apagar em exposição Limpar parte da janela terminal. Se n for 0 ou não especificado, o comando limpa desde a posição actual do cursor até ao fim da janela. Se n for 1, o comando limpa da posição actual do cursor para o início da janela. O comando limpa todo o ecrã se o n for 2. Se o n for 3, o comando limpa toda a janela e apaga as linhas no buffer scroll-back.
CSI n K Apagar em linha Apagar a parte da linha. Se n for 0 ou não especificado, o comando apaga do cursor até ao fim da linha. Se n for 1, o comando apaga do cursor para o início da linha. Se n for 2, a linha inteira é apagada.
#include <iostream>

using std::cout;
using std::endl;

void ClearScrollback() { cout << "\x1B[3J\x1B[H"; }

int main() {
  cout << "Some console filling text ..." << endl;
  cout << "Another filler string for the stdout\n"
          "Another filler string for the stdout\n"
          "Another filler string for the stdout\n"
          "Another filler string for the stdout\n"
          "Another filler string for the stdout\n"
       << endl;
  ClearScrollback();

  return EXIT_SUCCESS;
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook