Nunca puedo recordar cómo hago esto porque me sale con poca frecuencia. Pero en C o C ++, cuál es la mejor manera de leer un carácter desde la entrada estándar sin esperar una nueva línea (presione Intro).
Además, idealmente no reflejaría el carácter de entrada en la pantalla. Solo quiero capturar las pulsaciones del teclado sin afectar la pantalla de la consola.
c++
c
inputstream
Adán
fuente
fuente
Respuestas:
Eso no es posible de manera portátil en C ++ puro, porque depende demasiado del terminal utilizado con el que pueda estar conectado
stdin
(generalmente están almacenados en línea). Sin embargo, puede usar una biblioteca para eso:conio disponible con compiladores de Windows. Use la
_getch()
función para darle un carácter sin esperar la tecla Intro. No soy un desarrollador frecuente de Windows, pero he visto a mis compañeros de clase simplemente incluirlo<conio.h>
y usarlo. Verconio.h
en Wikipedia. Enumeragetch()
, que se declara obsoleto en Visual C ++.maldiciones disponibles para Linux. Las implementaciones de maldiciones compatibles también están disponibles para Windows. También tiene una
getch()
función. (intenteman getch
ver su página de manual). Ver Maldiciones en Wikipedia.Te recomendaría usar maldiciones si buscas compatibilidad multiplataforma. Dicho esto, estoy seguro de que hay funciones que puede usar para desactivar el almacenamiento en línea (creo que eso se llama "modo sin procesar", en lugar de "modo cocido" - ver
man stty
). Las maldiciones se encargarían de eso de manera portátil, si no me equivoco.fuente
ncurses
es la variante recomendada decurses
.En Linux (y otros sistemas similares a Unix) esto se puede hacer de la siguiente manera:
Básicamente, debe desactivar el modo canónico (y el modo de eco para suprimir el eco).
fuente
read
. He incluido ambos encabezados.error: ‘perror’ was not declared in this scope
cuando se compila, pero funciona bien cuando se incluyestdio.h
junto conunistd.h
.Encontré esto en otro foro mientras buscaba resolver el mismo problema. Lo modifiqué un poco de lo que encontré. Funciona muy bien Estoy ejecutando OS X, por lo que si está ejecutando Microsoft, deberá encontrar el comando system () correcto para cambiar a los modos crudo y cocido.
fuente
#include <stdlib.h>
CONIO.H
Las funciones que necesita son:
libconio http://sourceforge.net/projects/libconio
o
Implementación Linux c ++ de conio.h http://sourceforge.net/projects/linux-conioh
fuente
Si está en Windows, puede usar PeekConsoleInput para detectar si hay alguna entrada,
luego use ReadConsoleInput para "consumir" el carácter de entrada.
para ser honesto, esto es de algún código antiguo que tengo, así que tienes que jugar un poco con él.
Sin embargo, lo bueno es que lee la entrada sin solicitar nada, por lo que los caracteres no se muestran en absoluto.
fuente
Esto se usa
kbhit()
para verificar si se está presionando el teclado y se usagetch()
para obtener el carácter que se está presionando.fuente
Suponiendo que Windows, eche un vistazo a la función ReadConsoleInput .
fuente
C y C ++ tienen una visión muy abstracta de E / S, y no hay una forma estándar de hacer lo que desea. Hay formas estándar de obtener caracteres de la secuencia de entrada estándar, si hay alguna que obtener, y ninguno de los dos idiomas define nada más. Por lo tanto, cualquier respuesta tendrá que ser específica de la plataforma, tal vez dependiendo no solo del sistema operativo sino también del marco del software.
Aquí hay algunas conjeturas razonables, pero no hay forma de responder a su pregunta sin saber cuál es su entorno objetivo.
fuente
Utilizo kbhit () para ver si hay un char y luego getchar () para leer los datos. En Windows, puede usar "conio.h". En Linux, tendrá que implementar su propio kbhit ().
Ver código a continuación:
fuente
Lo más parecido a portable es usar la
ncurses
biblioteca para poner el terminal en "modo cbreak". La API es gigantesca; las rutinas que más querrás soninitscr
yendwin
cbreak
ynocbreak
getch
¡Buena suerte!
fuente
La siguiente es una solución extraída de la Programación Expert C: Deep Secrets , que se supone que funciona en SVr4. Utiliza stty y ioctl .
fuente
Siempre quise un bucle para leer mi entrada sin presionar la tecla de retorno. Esto funcionó para mí.
fuente
¡ncurses proporciona una buena manera de hacer esto! Además, esta es mi primera publicación (que puedo recordar), por lo que cualquier comentario es bienvenido. Apreciaré los útiles, ¡pero todos son bienvenidos!
para compilar: g ++ -std = c ++ 11 -pthread -lncurses .cpp -o
fuente
funciona para mí en windows:
fuente
Puede hacerlo de forma portátil utilizando SDL (la Biblioteca Simple DirectMedia), aunque sospecho que es posible que no le guste su comportamiento. Cuando lo probé, tuve que hacer que SDL creara una nueva ventana de video (aunque no la necesitaba para mi programa) y que esta ventana "tomara" casi todas las entradas del teclado y el mouse (lo cual estaba bien para mi uso pero podría ser molesto o inviable en otras situaciones). Sospecho que es excesivo y no vale la pena a menos que sea imprescindible la portabilidad completa; de lo contrario, pruebe una de las otras soluciones sugeridas.
Por cierto, esto te dará pulsación de teclas y eventos de lanzamiento por separado, si te gusta eso.
fuente
Aquí hay una versión que no se aplica al sistema (escrita y probada en macOS 10.14)
fuente