Como no título. Como posso limpar o console em C ++?
Como no título. Como posso limpar o console em C ++?
Respostas:
Para C ++ puro
Você não pode. C ++ nem mesmo tem o conceito de console.
O programa pode estar imprimindo em uma impressora, emitindo diretamente para um arquivo ou sendo redirecionado para a entrada de outro programa para todos os cuidados. Mesmo se você pudesse limpar o console em C ++, tornaria esses casos significativamente mais confusos.
Veja esta entrada no comp.lang.c ++ FAQ:
Específico do sistema operacional
Se ainda fizer sentido limpar o console em seu programa e você estiver interessado em soluções específicas do sistema operacional, elas existem.
Para Windows (como em sua tag), verifique este link:
Edit: Esta resposta mencionada anteriormente usando system("cls");
, porque a Microsoft disse para fazer isso. No entanto, foi apontado nos comentários que isso não é uma coisa segura a se fazer . Removi o link para o artigo da Microsoft devido a esse problema.
Bibliotecas (um tanto portáteis)
ncurses é uma biblioteca que oferece suporte à manipulação de console:
system
e adicionou um link ao seu artigo explicando o porquê.
Para Windows, por meio da API do console:
void clear() {
COORD topLeft = { 0, 0 };
HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO screen;
DWORD written;
GetConsoleScreenBufferInfo(console, &screen);
FillConsoleOutputCharacterA(
console, ' ', screen.dwSize.X * screen.dwSize.Y, topLeft, &written
);
FillConsoleOutputAttribute(
console, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE,
screen.dwSize.X * screen.dwSize.Y, topLeft, &written
);
SetConsoleCursorPosition(console, topLeft);
}
Felizmente, ele ignora todos os erros possíveis, mas hey, é a limpeza do console. Não como system("cls")
lida melhor com erros.
Para * nixes, você geralmente pode usar códigos de escape ANSI, então seria:
void clear() {
// CSI[2J clears screen, CSI[H moves the cursor to top-left corner
std::cout << "\x1B[2J\x1B[H";
}
Usar system
para isso é simplesmente feio.
echo
via em system()
vez de escrever para stdout.
system()
é um erro comum. Da mesma forma, é o seu método sugerido para Unices. Isso é o que se deve fazer em sistemas POSIX. Você acertou a parte do Win32, embora não tenha incorporado a convenção de "rolar para trás".
Para Linux / Unix e talvez alguns outros, mas não para Windows antes de 10 TH2:
printf("\033c");
irá reiniciar o terminal.
A maneira mais fácil para mim sem ter que reinventar a roda.
void Clear()
{
#if defined _WIN32
system("cls");
//clrscr(); // including header file : conio.h
#elif defined (__LINUX__) || defined(__gnu_linux__) || defined(__linux__)
system("clear");
//std::cout<< u8"\033[2J\033[1;1H"; //Using ANSI Escape Sequences
#elif defined (__APPLE__)
system("clear");
#endif
}
#include <conio.h>
clrscr();
std::cout<< u8"\033[2J\033[1;1H";
TERM environment variable not set.
enviar várias linhas para o console da janela é inútil ... ele apenas adiciona linhas vazias a ele. infelizmente, o modo é específico do Windows e envolve conio.h (e clrscr () pode não existir, também não é um cabeçalho padrão) ou o método Win API
#include <windows.h>
void ClearScreen()
{
HANDLE hStdOut;
CONSOLE_SCREEN_BUFFER_INFO csbi;
DWORD count;
DWORD cellCount;
COORD homeCoords = { 0, 0 };
hStdOut = GetStdHandle( STD_OUTPUT_HANDLE );
if (hStdOut == INVALID_HANDLE_VALUE) return;
/* Get the number of cells in the current buffer */
if (!GetConsoleScreenBufferInfo( hStdOut, &csbi )) return;
cellCount = csbi.dwSize.X *csbi.dwSize.Y;
/* Fill the entire buffer with spaces */
if (!FillConsoleOutputCharacter(
hStdOut,
(TCHAR) ' ',
cellCount,
homeCoords,
&count
)) return;
/* Fill the entire buffer with the current colors and attributes */
if (!FillConsoleOutputAttribute(
hStdOut,
csbi.wAttributes,
cellCount,
homeCoords,
&count
)) return;
/* Move the cursor home */
SetConsoleCursorPosition( hStdOut, homeCoords );
}
Para o sistema POSIX é muito mais simples, você pode usar ncurses ou funções de terminal
#include <unistd.h>
#include <term.h>
void ClearScreen()
{
if (!cur_term)
{
int result;
setupterm( NULL, STDOUT_FILENO, &result );
if (result <= 0) return;
}
putp( tigetstr( "clear" ) );
}
// #define _WIN32_WINNT 0x0500 // windows >= 2000
#include <windows.h>
#include <iostream>
using namespace std;
void pos(short C, short R)
{
COORD xy ;
xy.X = C ;
xy.Y = R ;
SetConsoleCursorPosition(
GetStdHandle(STD_OUTPUT_HANDLE), xy);
}
void cls( )
{
pos(0,0);
for(int j=0;j<100;j++)
cout << string(100, ' ');
pos(0,0);
}
int main( void )
{
// write somthing and wait
for(int j=0;j<100;j++)
cout << string(10, 'a');
cout << "\n\npress any key to cls... ";
cin.get();
// clean the screen
cls();
return 0;
}
Para limpar a tela, você primeiro precisa incluir um módulo:
#include <stdlib.h>
isso importará os comandos do Windows. Depois, você pode usar a função 'sistema' para executar comandos em lote (que editam o console). No Windows em C ++, o comando para limpar a tela seria:
system("CLS");
E isso limparia o console. Todo o código ficaria assim:
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
system("CLS");
}
E isso é tudo que você precisa! Boa sorte :)
stdlib.h
é especificado pelo padrão C e não tem nada a ver com "importação de comandos do Windows" nem com o próprio Windows. Exceto por detalhes, você está bem.
No Windows:
#include <cstdlib>
int main() {
std::system("cls");
return 0;
}
Em Linux / Unix:
#include <cstdlib>
int main() {
std::system("clear");
return 0;
}
Isso é difícil de fazer no MAC visto que não tem acesso às funções do Windows que podem ajudar a limpar a tela. Minha melhor solução é fazer um loop e adicionar linhas até que o terminal esteja limpo e, em seguida, executar o programa. No entanto, isso não é tão eficiente ou de memória amigável se você usar principalmente e com freqüência.
void clearScreen(){
int clear = 5;
do {
cout << endl;
clear -= 1;
} while (clear !=0);
}
Use system("cls")
para limpar a tela:
#include <stdlib.h>
int main(void)
{
system("cls");
return 0;
}
No Windows, temos várias opções:
clrscr () (arquivo de cabeçalho: conio.h)
sistema ("cls") (arquivo de cabeçalho: stdlib.h)
No Linux, use system ("clear") (arquivo de cabeçalho: stdlib.h)
Esta é uma maneira simples de fazer isso:
#include <iostream>
using namespace std;
int main()
{
cout.flush(); // Flush the output stream
system("clear"); // Clear the console with the "system" function
}
Use System :: Console :: Clear ();
Isso irá limpar (esvaziar) o buffer
#include <cstdlib>
void cls(){
#if defined(_WIN32) //if windows
system("cls");
#else
system("clear"); //if other
#endif //finish
}
Basta chamar cls () em qualquer lugar
Você pode usar o método de console claro do sistema operacional via sistema ("");
para windows seria system ("cls"); por exemplo, em
vez de liberar três códigos diferentes para sistemas operacionais diferentes. basta fazer um método para obter o que o sistema operacional está executando.
você pode fazer isso detectando se existem variáveis de sistema exclusivas com #ifdef,
por exemplo
enum OPERATINGSYSTEM = {windows = 0, mac = 1, linux = 2 /*etc you get the point*/};
void getOs(){
#ifdef _WIN32
return OPERATINGSYSTEM.windows
#elif __APPLE__ //etc you get the point
#endif
}
int main(){
int id = getOs();
if(id == OPERATINGSYSTEM.windows){
system("CLS");
}else if (id == OPERATINGSYSTEM.mac){
system("CLEAR");
} //etc you get the point
}
editar: pergunta completamente refeita
Basta testar em qual sistema eles estão e enviar um comando de sistema dependendo do sistema. embora isso seja definido em tempo de compilação
#ifdef __WIN32
system("cls");
#else
system("clear"); // most other systems use this
#endif
Este é um método completamente novo!
cout
pode ter sido redirecionado para um arquivo. Então não há conceito de console.
use: clrscr ();
#include <iostream>
using namespace std;
int main()
{
clrscr();
cout << "Hello World!" << endl;
return 0;
}
A maneira mais fácil seria liberar o fluxo várias vezes (de preferência maior do que qualquer console possível). 1024 * 1024 é provavelmente um tamanho que nenhuma janela de console poderia ter.
int main(int argc, char *argv)
{
for(int i = 0; i <1024*1024; i++)
std::cout << ' ' << std::endl;
return 0;
}
O único problema com isso é o cursor do software; aquela coisa piscando (ou não piscando) dependendo da plataforma / console estará no final do console, oposto ao topo dele. No entanto, isso nunca deve induzir qualquer problema, espero.