C/Visual C - getch() usando cin

 
Vista:

getch() usando cin

Publicado por Googol (255 intervenciones) el 13/11/2002 23:07:56
Hola!

¿Alguien sabe cómo implementar la función getch() de conio.h utilizando cin de la librería estándar de C++?
No pretendo detectar la pulsación de teclas especiales (como F1 etc.) simplemente caracteres.
Aunque lo preferiría, tampoco es necesario que no se muestre por la salida estandar las teclas que se pulsan.
Simplemente quiero que cin no espere a que el usuario pulse Intro para que empiece a evaluar la entrada.
He probado con cin.get(), con cin.peek(), accediendo a la información del buffer para ver si hay caracteres... pero nada. cin siempre se queda esperando a que pulse Intro antes de empezar a darme los datos.
¿Alguna idea?

Gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Implementación de getch() con cin en C++ sin esperar a Enter

Publicado por Alejandro (913 intervenciones) el 02/04/2025 20:12:24
Hola, Googol.

Para implementar una funcionalidad similar a `getch()` de `conio.h` utilizando `cin` de la librería estándar de C++, puedes considerar el uso de hilos (threads) para permitir que la entrada del usuario se procese de manera asíncrona. Aquí te dejo un ejemplo básico de cómo podrías hacerlo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <thread>
#include <atomic>
#include <conio.h> // Para _kbhit() y _getch()
 
std::atomic<bool> running(true);
 
void inputThread() {
    while (running) {
        if (_kbhit()) { // Verifica si hay una tecla presionada
            char ch = _getch(); // Captura la tecla sin esperar a Enter
            std::cout << "Tecla presionada: " << ch << std::endl;
        }
    }
}
 
int main() {
    std::thread t(inputThread); // Inicia el hilo de entrada
 
    std::cout << "Presiona cualquier tecla (o 'q' para salir):" << std::endl;
 
    while (running) {
        // Aquí puedes realizar otras tareas
        // Por ejemplo, puedes usar cin para leer otras entradas
        std::string input;
        std::getline(std::cin, input);
        if (input == "q") {
 running = false; // Termina el hilo si se ingresa 'q'
        }
    }
 
    t.join(); // Espera a que el hilo termine
    std::cout << "Programa terminado." << std::endl;
    return 0;
}

Explicación:


1. Hilo de entrada: Se crea un hilo que ejecuta la función `inputThread()`, que verifica continuamente si hay una tecla presionada utilizando `_kbhit()` y captura la tecla con `_getch()`.
2. Atomicidad: Se utiliza `std::atomic<bool>` para controlar el estado de ejecución del hilo de entrada de manera segura entre hilos.
3. Salida: El programa principal puede seguir ejecutándose y procesando otras entradas, como `cin`, mientras el hilo de entrada está activo.

Notas:


- Este enfoque permite que el programa responda a las pulsaciones de teclas sin esperar a que se presione Enter.
- Ten en cuenta que `_kbhit()` y `_getch()` son específicos de Windows. Si estás utilizando un sistema diferente, necesitarás una solución alternativa, como manipular la configuración del terminal.

Espero que esto te ayude a implementar la funcionalidad que buscas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar