CodeBlocks não entende o comando cls [RESOLVIDO]

1. CodeBlocks não entende o comando cls [RESOLVIDO]

Luis Augusto Meyer Caldas Nascimento
luimeyer

(usa Ubuntu)

Enviado em 10/11/2015 - 10:56h

Meu código tem um trecho com o comando "cls", que limpa a tela, porem na impressão na linha de comando, aparede :
cls: not found.



Alguem pode me ajudar ?

Uso ubuntu 14.04 - x64
Codeblocks 13.12


  


2. Re: CodeBlocks não entende o comando cls

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 10/11/2015 - 11:08h

Amigo, o comando 'cls' (assim como o comando 'pause'), são comandos exclusivos do sistema 'Janelas'.

No Linux para limpar a tela utilize o comando system("clear"); (não recomendável), ou crie uma função igual a esta e chame assim:



#include <stdio.h>
/* E outros includes caso necessite ... */

#ifdef __unix__
# include <unistd.h>
# include <term.h>
#elif defined(_WIN32)
# include <windows.h>
#elif defined(__DOS__) || defined(__MSDOS__)
# include <conio.h>
#endif

void my_cls(void){
#ifdef __unix__
static bool bad_term=false;

if(!bad_term){
// Caso o terminal ainda não tenha sido inicializado, Inicializa-o.
if(!cur_term){
int err_code;
if(setupterm(NULL, STDOUT_FILENO, &err_code)==ERR){
bad_term=true;
goto term_is_bad;
}
}
putp(clear_screen);
return;
}
#elif defined(_WIN32)
static bool bad_console=false;
static HANDLE hConsole=INVALID_HANDLE_VALUE;

if(!bad_console){
if(hConsole==INVALID_HANDLE_VALUE){
hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
if(hConsole==INVALID_HANDLE_VALUE){
bad_console=true;
goto term_is_bad;
}
}

static COORD top_left_coord = { 0, 0 };

CONSOLE_SCREEN_BUFFER_INFO screen_info;
DWORD screen_size, n_chars_affected;
WORD current_output_attributes;

// Pega tamanho atual da tela (executa toda vez, pois pode mudar).
if(!GetConsoleScreenBufferInfo(hConsole, &screen_info)){
bad_console=true;
goto term_is_bad;
}
screen_size=screen_info.dwSize.X*screen_info.dwSize.Y;
current_output_attributes=screen_info.wAttributes;

// Enche a tela de espaços e depois muda os atributos.
if(
!FillConsoleOutputCharacter(
hConsole, static_cast<TCHAR>(' '),
screen_size, top_left_coord, &n_chars_affected
) ||
!FillConsoleOutputAttribute(
hConsole, current_output_attributes,
screen_size, top_left_coord, &n_chars_affected
) ||
!SetConsoleCursorPosition(hConsole, top_left_coord)
){
bad_console=true;
goto term_is_bad;
}
return;
}
#elif defined(__DOS__) || defined(__MSDOS__)
clrscr();
#endif

#if !defined(__DOS__) && !defined(__MSDOS__)
term_is_bad:
/*
Tipo de terminal desconhecido ou com erro. "Limpa" a tela
somente pulando uma quantidade razoável de linhas, quiçá
arrastando o texto anterior para fora.
*/
for(int i=0; i<100; i++)
putchar('\n');
#endif
}

/* Outras funções caso necessite... */

int main(){
printf("Hello World\n");
my_cls();
return 0;
}



Fazendo dessa maneira você deixa seu código portável e não requer mudanças nele, apenas recompilar em cada sistema.

Recomendo ler este[1] tópico onde essa função é criada para entender o funcionamento dela.

Espero ter ajudado

Se ajudei, marque o tópico como Resolvido e clique em Melhor Resposta!

Nota: Talvez seja necessário instalar a biblioteca libncurses5-dev para funcionar do modo correto (sudo apt-get install libncurses5-dev caso seja derivado do Debian)

[]'s

T+

[1] http://www.vivaolinux.com.br/topico/C-C++/Preciso-fazer-um-programa-em-C-para-cadastra-alunos-consul...

--

Att,

Thiago Henrique Hüpner

(Mensagem scaneada pelo antivírus........ops! não precisa, afinal eu uso Linux!)



3. Re: CodeBlocks não entende o comando cls

Paulo
paulo1205

(usa Ubuntu)

Enviado em 10/11/2015 - 12:50h

Thihup escreveu:

#include <stdio.h>

#ifdef __unix__
# include <unistd.h>
# include <term.h>
#elif defined(_WIN32)
# include <windows.h>
#elif defined(__DOS__) || defined(__MSDOS__)
# include <conio.h>
#endif

void my_cls(void){
#ifdef __unix__
static bool bad_term=false;

if(!bad_term){
// Caso o terminal ainda não tenha sido inicializado, Inicializa-o.
if(!cur_term){
int err_code;
if(setupterm(NULL, STDOUT_FILENO, &err_code)==ERR){
bad_term=true;
goto term_is_bad;
}
}
putp(clear_screen);
return;
}
#elif defined(_WIN32)
static bool bad_console=false;
static HANDLE hConsole=INVALID_HANDLE_VALUE;

if(!bad_console){
if(hConsole==INVALID_HANDLE_VALUE){
hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
if(hConsole==INVALID_HANDLE_VALUE){
bad_console=true;
goto term_is_bad;
}
}

static COORD top_left_coord = { 0, 0 };

CONSOLE_SCREEN_BUFFER_INFO screen_info;
DWORD screen_size, n_chars_affected;
WORD current_output_attributes;

// Pega tamanho atual da tela (executa toda vez, pois pode mudar).
if(!GetConsoleScreenBufferInfo(hConsole, &screen_info)){
bad_console=true;
goto term_is_bad;
}
screen_size=screen_info.dwSize.X*screen_info.dwSize.Y;
current_output_attributes=screen_info.wAttributes;

// Enche a tela de espaços e depois muda os atributos.
if(
!FillConsoleOutputCharacter(
hConsole, static_cast<TCHAR>(' '),
screen_size, top_left_coord, &n_chars_affected
) ||
!FillConsoleOutputAttribute(
hConsole, current_output_attributes,
screen_size, top_left_coord, &n_chars_affected
) ||
!SetConsoleCursorPosition(hConsole, top_left_coord)
){
bad_console=true;
goto term_is_bad;
}
return;
}
#elif defined(__DOS__) || defined(__MSDOS__)
clrscr();
#endif

#if !defined(__DOS__) && !defined(__MSDOS__)
term_is_bad:
/*
Tipo de terminal desconhecido ou com erro. "Limpa" a tela
somente pulando uma quantidade razoável de linhas, quiçá
arrastando o texto anterior para fora.
*/
for(int i=0; i<100; i++)
putchar('\n');
#endif
}


É interessante você olhar para um trecho de código e constatar, só pela aparência, que esse código é seu.

Isso me deixa ainda mais à vontade para sugerir uma mudança óbvia, que eu não sei como deixei passar quando o enviei para o fórum pela primeira vez (aliás, obrigado, Thihup, por indicar o link em que ele foi postado pela primeira vez; eu mesmo não lembrava dele). A sugestão é trocar o bloco

#elif defined(__DOS__) || defined(__MSDOS__)
clrscr();
#endif

#if !defined(__DOS__) && !defined(__MSDOS__)
term_is_bad:
/*
Tipo de terminal desconhecido ou com erro. "Limpa" a tela
somente pulando uma quantidade razoável de linhas, quiçá
arrastando o texto anterior para fora.
*/
for(int i=0; i<100; i++)
putchar('\n');
#endif
}


pelo conteúdo abaixo.

#elif defined(__DOS__) || defined(__MSDOS__)
clrscr();
return;
#endif

term_is_bad:
/*
Tipo de terminal desconhecido ou com erro. "Limpa" a tela
somente pulando uma quantidade razoável de linhas, quiçá
arrastando o texto anterior para fora.
*/
for(int i=0; i<100; i++)
putchar('\n');
}



4. Obrigado

Luis Augusto Meyer Caldas Nascimento
luimeyer

(usa Ubuntu)

Enviado em 10/11/2015 - 16:03h

Valeu galera, resolvido.
só mudei o system("cls"); para system("clear");


Obrigado






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts