Nunca me lembro de como faço isso, porque isso aparece com pouca frequência para mim. Mas em C ou C ++, qual é a melhor maneira de ler um caractere da entrada padrão sem esperar por uma nova linha (pressione enter).
Idealmente, também não ecoaria o caractere de entrada na tela. Eu só quero capturar pressionamentos de tecla sem afetar a tela do console.
c++
c
inputstream
Adão
fonte
fonte
Respostas:
Isso não é possível de maneira portátil em C ++ puro, porque depende muito do terminal usado que pode ser conectado
stdin
(eles geralmente são armazenados em buffer de linha). No entanto, você pode usar uma biblioteca para isso:disponível com compiladores do Windows. Use a
_getch()
função para fornecer um caractere sem aguardar a tecla Enter. Não sou desenvolvedor de Windows frequente, mas já vi meus colegas de classe incluí<conio.h>
-lo e usá-lo. Vejaconio.h
na Wikipedia. Ele listagetch()
, que é declarado obsoleto no Visual C ++.maldições disponíveis para Linux. Implementações de maldições compatíveis também estão disponíveis para Windows. Também tem uma
getch()
função. (tenteman getch
visualizar sua página de manual). Veja Maldições na Wikipedia.Eu recomendaria que você usasse maldições se pretender compatibilidade entre plataformas. Dito isso, tenho certeza de que existem funções que você pode usar para desativar o buffer de linha (acredito que isso seja chamado de "modo bruto", em oposição ao "modo cozido" - veja
man stty
). Maldições lidariam com isso de maneira portátil, se não me engano.fonte
ncurses
é a variante recomendada decurses
.No Linux (e em outros sistemas unix), isso pode ser feito da seguinte maneira:
Basicamente, você precisa desativar o modo canônico (e o modo de eco para suprimir o eco).
fonte
read
. Eu incluí os dois cabeçalhos.error: ‘perror’ was not declared in this scope
quando compila, mas funciona bem quando incluídostdio.h
juntounistd.h
.Encontrei isso em outro fórum enquanto procurava resolver o mesmo problema. Eu o modifiquei um pouco do que encontrei. Isso funciona muito bem. Estou executando o OS X, portanto, se você estiver executando o Microsoft, precisará encontrar o comando system () correto para alternar para os modos cru e cozido.
fonte
#include <stdlib.h>
CONIO.H
as funções que você precisa são:
libconio http://sourceforge.net/projects/libconio
ou
Implementação do Linux c ++ de conio.h http://sourceforge.net/projects/linux-conioh
fonte
Se você estiver no Windows, poderá usar o PeekConsoleInput para detectar se há alguma entrada,
use ReadConsoleInput para "consumir" o caractere de entrada.
para ser honesto, isso é de algum código antigo que eu tenho, então você precisa mexer um pouco nele.
O legal é que ele lê as entradas sem solicitar nada, para que os caracteres não sejam exibidos.
fonte
Isso serve
kbhit()
para verificar se o teclado está sendo pressionado egetch()
para obter o caractere que está sendo pressionado.fonte
Supondo que o Windows, dê uma olhada na função ReadConsoleInput .
fonte
C e C ++ adotam uma visão muito abstrata da E / S e não há uma maneira padrão de fazer o que você deseja. Existem maneiras padrão de obter caracteres do fluxo de entrada padrão, se houver algum, e nada mais é definido por nenhum idioma. Qualquer resposta precisará, portanto, ser específica da plataforma, talvez dependendo não apenas do sistema operacional, mas também da estrutura do software.
Há algumas suposições razoáveis aqui, mas não há como responder à sua pergunta sem saber qual é o seu ambiente de destino.
fonte
Eu uso kbhit () para ver se um char está presente e, em seguida, getchar () para ler os dados. No Windows, você pode usar "conio.h". No linux, você terá que implementar seu próprio kbhit ().
Veja o código abaixo:
fonte
O mais próximo do portátil é usar a
ncurses
biblioteca para colocar o terminal no "modo de interrupção". A API é gigantesca; as rotinas que você mais deseja sãoinitscr
eendwin
cbreak
enocbreak
getch
Boa sorte!
fonte
A seguir, uma solução extraída da programação Expert C: Deep Secrets , que deve funcionar no SVr4. Ele usa stty e ioctl .
fonte
Eu sempre quis um loop para ler minha entrada sem pressionar a tecla Enter. isso funcionou para mim.
fonte
O ncurses fornece uma boa maneira de fazer isso! Além disso, este é o meu primeiro post (que me lembro), então quaisquer comentários são bem-vindos. Eu aprecio os úteis, mas todos são bem-vindos!
compilar: g ++ -std = c ++ 11 -pthread -lncurses .cpp -o
fonte
funciona para mim no windows:
fonte
Você pode fazer isso de maneira portável usando SDL (a Simple DirectMedia Library), embora eu suspeite que você não goste do comportamento dele. Quando o experimentei, tive que fazer com que o SDL criasse uma nova janela de vídeo (mesmo que não precisasse dela para o meu programa) e ter essa janela "agarrada" quase todas as entradas de teclado e mouse (o que foi bom para o meu uso, mas poderia irritante ou impraticável em outras situações). Eu suspeito que é um exagero e não vale a pena, a menos que a portabilidade completa seja uma obrigação - caso contrário, tente uma das outras soluções sugeridas.
A propósito, isso fornecerá pressionamentos de tecla e liberará eventos separadamente, se você gostar.
fonte
Aqui está uma versão que não é concedida ao sistema (escrita e testada no macOS 10.14)
fonte