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>.