Semelhante ao getch() [RESOLVIDO]

1. Semelhante ao getch() [RESOLVIDO]

João Vitor
defer

(usa Slackware)

Enviado em 31/03/2015 - 21:19h

Boa noite,
Galera, eu to fazendo curso de informatica, e a matéria agora é programação em C++. No laboratorio é utilizado tanto Windows quanto LINUX, porém em casa eu uso linux. No windows eu tenho a biblioteca conio.h, e a função getch(), e no LINUX tem a copia (ncurses.h/conio.h), consegui instalar, porém não consegui usar. No linux, tem uma função da lib stdio.h, chamada getchar(), semelhante ao getch() da conio.h, porém no windows, o programa recebe o caractere, e não imprime ele na tela, passando direto para a proxima ação no programa. Já o getchar(), recebe o caractere, imprime na tela, e só continua as ações se for pressionado o enter.
Gostaria de saber se tem alguma sintaxe do getchar(), que o torne semelhante ao getch(), de forma que qualquer tecla pressionada, faça com que o programa continue rodando.


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 01/04/2015 - 22:59h

Primeiro, uma correção histórica: a Curses é mais antiga que a ConIO, e bem mais completa do que ela. Se alguém copiou alguém, a ConIO não tem o direito de ser chamada de original.

Quando a ConIO apareceu, lá pelo fim da década de 1980, ela foi pensada para entrada e saída no console dos PCs que executavam MS-DOS. Ou seja: só havia um terminal (o console) e só um usuário. Isso é muito mais simples do que o universo do UNIX em que se criou a Curses, que possuía vários usuários, em vários terminais simultâneos, e com cada terminal podendo ter propriedades e modo de funcionamento diferente dos demais. Lembre-se, por exemplo, que ainda na mesma década de 1980, sistemas com UNIX possuíam vários usuários conectados por terminais seriais e, ao mesmo tempo, aceitavam conexões em terminais virtuais por rede e emuladores gráficos de terminal.

A função getch() da Curses, por si só, não é muito diferente da sua cópia na ConIO. No entanto, enquanto a ConIO do MS-DOS pode ler direto o controlador do teclado do PC, a Curses tem de estar preparada para lidar com os diferentes tipos de terminal apresentados pelo UNIX. Por isso, aplicações que usam Curses geralmente preparam o terminal para uso antes de fazerem chamadas a outras funções da biblioteca, e algumas dessas funções só funcionam se tal preparação anterior tiver sido feita. É o caso de getch().

Você mencionou que é iniciante. Uma coisa que eu vejo muito por aqui é gente iniciante que encontra código com getch() e que fica preocupada quando não consegue usar isso no Linux. Na grande maioria das vezes, tudo o que o tal getch() faz no programa é dar uma pausa, principalmente porque alguns programas de DOS ou modo console do Windows têm sua janela fechada ao final da execução, antes que o usuário tenha tempo de ver o que apareceu como resultado. Esse uso (e outro, pior ainda: o famigerado “system("pause");”) não passam de gambiarras. E eu considero simplesmente nocivo que se ensinem preguiça e vícios num curso de introdução à programação.

A função getchar() tem outra história. Ela não foi feita tendo qualquer tipo de console ou terminal em mente, mas tão somente um fluxo (stream) de dados, na forma de uma sequência de caracteres. Que a entrada de dados padrão seja normalmente associada ao teclado do terminal (e as saídas padrão e de erro à tela) é mera conveniência, e não chega nem mesmo a ser uma regra. Por questão de eficiência, os streams geralmente têm buffers de dados. É possível desligar esses buffers de streams mas, no caso do mundo UNIX, o próprio kernel pode também ter -- e geralmente tem -- buffers associados ao terminal (não me meto a comentar sobre DOS e Windows porque desconheço esses detalhes nesses sistemas).

Parte do que as funções de preparação da Curses faz é justamente lidar com essas questões de buffers, tanto em nível de biblioteca de I/O quanto no de kernel. Por isso mesmo, num programa em que você opte por usar Curses não deve mais usar as funções de entrada e saída do padrão do C, como printf(), getchar() ou scanf(). Isso, aliás, vale também para ConIO (ainda que os efeitos de não respeitar a restrição talvez não sejam tão perceptíveis quanto o são com Curses).

Se as consequências de usar Curses forem muito drásticas, você pode optar por um meio termo: implementar por conta própria as operações de baixo nível somente para a leitura, e poder continuar a imprimir com as funções tradicionais. Veja, por exemplo, os seguintes tópicos deste fórum: <http://www.vivaolinux.com.br/topico/C-C++/Como-ler-dados-do-teclado-sem-interromper-execucao-do-prog...> e <http://www.vivaolinux.com.br/topico/C-C++/Duvida-com-realloc-em-C>.





Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts