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

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


Substituindo a função kbhit() em curses



A função kbhit() no Linux. Para substituí-la não precisaremos executar nenhum teste com if, como no caso:

if ( kbhit() )
{
  tecla = getch();

Esse é o método comum usando na conio.h. Na verdade não encontrei nenhuma função exatamente igual a kbhit, mas se você colocar a função timeout(0) no início do bloco, garantirá a execução do bloco independente da entrada do teclado.

Ficará assim:

int main()
{
   char tecla;
   initscr();
   clear();
   timeout(0); //a função já garante a execução do bloco com ou sem entrada de teclado;
   keypad(stdscr, TRUE);
   noecho();

Concluindo, é fácil converter aplicações originalmente programadas em Windows para funcionarem no Linux substituindo a conio.h pela ncurses.h.

Espero ter ajudado com este artigo. Ainda pretendo pôr bem mais.

Liberdade para todos, e Viva o Linux!!!

Página anterior    

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

Reprodução de arquivos WAV com SDL_mixer e linguagem C

Escrevendo o caos em C

C - Include e Makefile

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

Criando um sistema operacional com ASM e 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 [email protected] 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

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts