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: 52.979 ]

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


conio.h e curses.h



Estou cursando programação de jogos e estudando C++. Só que como estamos acostumados a ver que o mercado tende para o lado do mais "caro" rsrsrs, no caso para o sistema operacional Windows, assim também não seria diferente a orientação "tecnológica" do meu curso (não os culpo). Até alguns dias eu conseguia compilar os códigos dos exercícios tanto em Windows quanto em Linux, mas me deparei com uma situação desesperadora, programamos em aula um protótipo de Tron em modo console. E para receber as entradas de dados utilizamos a biblioteca conio.h. Mal sabia eu a dor cabeça que teria.

Pois bem, na minha infindável busca na internet, descobri que a biblioteca curses.h seria a possível substituta, já que tem a mesma finalidade de receber dados do teclado, além de também exibir dados na saída padrão (stdout).

Certo ao iniciar o meu percurso em debulhar esta maravilhosa biblioteca, vi que as diferenças não são muitas, mas a estrutura do código teve de ser ligeiramente alterada.

Vamos seguir em frente. Quando utilizamos a biblioteca conio.h temos a possibilidade de executar as funções getch() para ler as entradas do teclado e kbhit() para testar se há buffers de teclado a serem lidos. É muito útil, e eu diria até indispensável o uso desta biblioteca para a programação de jogos e outro programas. Mas no ambiente Linux infelizmente não podemos contar com ela.

Ao invés disso, possuímos a biblioteca curses.h, mencionada anteriormente, que faz a mesma coisa, entretanto com ligeiras diferenças as quais são:

Para receber as entradas do teclado, tive de definir uma variável para a tecla pressionada, segue o exemplo:

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

using namespace std;

char tecla; // esta variável irá receber as entradas de teclado em modo char.

Estrutura do código ao chamar as funções em ncurses:

int main()
{
   tecla = 0; // atribuí um valor qualquer para a variável não ter estado no início do programa.
   while(1)
   {
      initscr(); // INICIA A CHAMADA DA NCURSES (Linux)
      clrtobot(); // Limpa a tela
      keypad(stdscr, TRUE); // carrega o módulo do teclado para a tela padrão
      noecho(); // não exibe as entradas de teclado no video.

No final bloco, quando não houver mais recebimento de entradas do teclado, deve-se adicionar as funções:

   refresh(); // Limpa o buffer de tela e exibe os buffers armazenados.
   delay_output(200); //Diminui a velocidade de execução do bloco em ms // OPCIONAL
   endwin(); // Finaliza a chamada da NCURSES

    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

LivreNFE - O emissor Nfe open source para Linux

Ponteiros void na linguagem C (parte 2)

Apreendendo a utilizar o GNU Debugger (parte 2)

Como aprender a programar e produzir aplicativos usando Euphoria

Criação e uso de um interpretador de script BrainFuck em 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 davirtavares 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
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts