Substituindo a biblioteca conio.h no Linux usando ncurses curses.h

Olá pessoal! Tive o objetivo de elaborar esse artigo para facilitar a vida daqueles que estão programando e não sabem como portar as funções da conio.h para o Linux.

[ Hits: 59.645 ]

Por: Erisson Silva em 08/07/2008 | Blog: http://linux2user.blogspot.com


Função getch() em curses



Ao efetuar a leitura do teclado utilizamos a função getch(), assim como na conio.h.

    cout << "Pressione 'c' para continuar\n";
    tecla = (int)getch(); /* atribuímos a tecla pressionada à variável tecla como inteiro. Assim quando formos exibí-la compararemos com o valor decimal da tecla, a qual poderemos descobrir com o programinha que eu fiz*/

Copie o código e salve com keycode.cpp. Compile da seguinte maneira:

$ gcc -o keycode keycode.cpp -lncurses

#include <iostream>
#include <curses.h>
#include <stdlib.h>


using namespace std;


int main()
{
   while(1)
   {
      char tecla;
      initscr();
      clear();
      printw("digite um caracter... \n"); // exibe o texto na tela, usa as mesmas sintaxes do printf.
      keypad(stdscr, TRUE);
      noecho();
      tecla = (int)getch();
      if( (tecla == 32 )
      {
         printw("tecla espaço\n");
      }
      else if( (tecla == 3 )
      {
         printw("tecla acima\n");
      }
      else if( tecla == 4 )
      {
         printw("tecla esquerda\n");
      }
      else if( tecla == 5 )
      {
         printw("tecla direita\n");
      }
      else if( tecla == 2 )
      {
         printw("tecla abaixo\n");
      }
      else
      {
         printw("tecla %c\n", tecla);
      }
      printw( "código: %d\n", tecla );
      refresh();
      delay_output(2000);
      endwin();
   }
   return(0);
}

Com esse programa você poderá testar todas as entradas de teclado e seus respectivos valores decimais.

OBS: Os valores decimais de dados do teclados são diferentes do ambiente Windows.

Sempre que houver leituras de dados do teclado ou exibição na saída padrão, isto deverá ser estruturado dentro da chamada da função initscr() da biblioteca ncurses e finalizado com endwin().

Se quiser você pode incluir todo o bloco dentro das tags ncurses.

Página anterior     Próxima página

Páginas do artigo
   1. conio.h e curses.h
   2. Função getch() em curses
   3. Substituindo a função kbhit() em curses
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Tutorial OpenGL

Programando em Qt

Tutorial OpenGL v2.0

Ponteiros void na linguagem C (parte 2)

Programando com uma granada de mão: uma visão da linguagem C

  
Comentários
[1] Comentário enviado por GuilhermeAugusto em 08/07/2008 - 21:42h

Bem interessante. Todo mundo que coda C já sofreu com a conio.h. Extremamente comum achar exemplos em livros contendo getch() ou mesmo system("PAUSE">>NULL); bastante difíceis pra portar pro Linux.

[2] Comentário enviado por f_Candido em 09/07/2008 - 00:09h

Muito Interessante. Parabéns. A lib conio é meio estranha de trabalhar.

Abraços

[3] Comentário enviado por removido em 09/07/2008 - 07:09h

Para deixar os programas ainda mais portáveis, experimente uma biblioteca que segue o padrão Curses para Windows, a PDCurses (http://pdcurses.sourceforge.net/), eu a usei para definitivamente substituir <conio.h> nos meus projetos da universidade. Eu até escrevi uma biblioteca de componentes (checkboxes, radiobuttons, edit etc) em cima dela (envio sob demanda). Abraços.

[4] Comentário enviado por iz@bel em 21/07/2008 - 16:57h

Oba!
Favoritos!!!
[]'s

[5] Comentário enviado por edimartin em 18/12/2008 - 23:58h

Olá. Eu fiz testes aqui usando a ncurses e eu gostaria de saber.

Porque quando eu uso o scanw (scanf da stdio em ncurses) e clico enter ele também printa na tela o enter?
E quando eu uso a getch se eu clico uma letra ele não faz nada, mas quando eu clico enter ele printa na tela o enter.
O que a nCurses tem que ela ama o enter?

Para retirar o enter do getch a solução é antes usar a funcao noecho que mesmo assim ele não printa o enter.

Mas eu não sei a solução para o scanw();

[6] Comentário enviado por erissonsilva em 23/12/2008 - 09:10h

Deixa eu ver se entendi, vc quer que o scanw() atribua um valor a uma variável sem a necessidade de enter. Acho que não funciona assim, mas eu imagino o porquê.
O meu código acima se vc reparou tem alguns erros, eu vou corrigir e repostar o código.
Repare que a função getch() não distingue a natureza da variável pois só tem a função de ler variáveis 'char', scanw() assim como scanf() captura variáreis de diversas naturezas, por isso ela necessita do enter.
Se vc quiser coloque após o initscr() a função raw(), pois esta captura os dados do teclado sem fazer distinção das teclas de controle do shell com CTRL+C ou CTRL+Z. Apenas lê os dados int de cada tecla ou combinação de teclas pressionadas, mas lembre-se de atribuir uma tecla para finalizar o programa se não terá de fechar o terminal. Ex.:

int quit;
quit = 27; // valor da tecla esc
// inclua mais um else if no código
else if (tecla == quit)
exit(0);

Assim vc terá controle total sobre a execução do seu código.
Qualquer dúvida respondo assim que puder. Um abraço e viva o Linux!!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts