Inicio > C/C++ > Actualizado stermp.h (getch(), getche() y kbhit() en Linux)

Actualizado stermp.h (getch(), getche() y kbhit() en Linux)

Miércoles, 30 de Junio de 2010 Gaspar Fernández Dejar un comentario Ir a comentarios

Hace más de un año publiqué algunas funciones para manejar colores en la terminal de forma fácil. (Ver link). El objetivo era aprender un poco cómo funciona la terminal, y de paso ayudarme con mis alumnos de clases particulares (casi todos utilizan conio.h), yo quería una alternativa; por otra parte, facilitar el uso en proyectos pequeños, ya que si queremos algo más, para eso está ncurses.

Me he decidido sacar una segunda versión, ya que la primera no disponía de sustituto para getch() ni kbhit(), recordemos que estas funciones son para pedir un carácter desde teclado sin echo y sin necesidad de pulsar ENTER, y detectar la pulsación de una tecla sin parar la ejecución del programa respectivamente.

Tengo que avisar también de que este código no funciona con las flechas del teclado (estas teclas no tienen un carácter asociado y lo que hacen es devolver varios códigos de tecla, el primero de ellos ESC (27)), lo dejo para la próxima actualización.

También hay algunas correcciones, y algunas novedades internas.

Para descargar: stermp.h y stermp.c

Para compilar stermp (Simple Terminal Play):

$ gcc -c stermp.c

Para compilar nuestros proyectos:

$ gcc -o proyecto proyecto.c stermp.o

Y ahora un pequeño código de prueba:

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <stdio.h>
#include <time.h>
#include "stermp.h"

void update_time()
{
  struct tm *tm;
  time_t _time;
  char texto[50];
  textcolor(YELLOW);
  _time=time(NULL);
  tm = localtime(&_time);
  strftime(texto,50,"%d/%m/%Y %H:%M:%S", tm);
  gotoxy(1,1);
  printf("%s    ", texto);
}

int main()
{
  int x,y;
  int ancho, alto;
  int tecla;
  term_init();
  ancho = screenwidth();
  alto = screenheight();

  /* Rellenamos de verde la pantalla */
  textbackground(GREEN);
  clrscr();

  textbackground(BLUE);
  /* Rellenamos de azul la primera fila */
  for (x=0; x<ancho; x++)
    printf(" ");

  gotoxy(1,alto);
  /* Rellenamos de azul la última fila */
  for (x=0; x<ancho; x++)
    printf(" ");

  gotoxy(2,2);
  while ((tecla=kbhit2())==0)
      update_time();    


  printf("Has pulsado: %d\n", tecla);

  term_defaults();
 
}
votar
  1. andres
    Domingo, 13 de Noviembre de 2011 a las 22:07 | #1

    Y como hago para utilizarlo con codeblocks?

  2. Martes, 22 de Noviembre de 2011 a las 03:51 | #2

    Introduce el .h y el .cpp en tu proyecto y compílalo. Debería funcionar. Espero tu comentario.

  3. Adrian
    Jueves, 12 de Abril de 2012 a las 13:48 | #3

    Estoy tratando de hacer andar el ejemplo “proyecto.c” pero tengo probkemas,

    Me da error la compilación, la cual realizo asi:
    $ gcc -o proyecto proyecto.c stermp.o

    /tmp/cc3nHWoW.o: In function `main’:
    proyecto.c:(.text+0xa2): undefined reference to `term_init’
    proyecto.c:(.text+0×14f): undefined reference to `kbhit2′
    proyecto.c:(.text+0×174): undefined reference to `term_defaults’
    collect2: ld returned 1 exit status

    El binario (ejecutable) no se genera.
    Desde ya te felicito por el aporte y te agradezco si me podés pasar algún dato.
    PD: stermp.c lo he probado con otro ejemlo y funciona bien. Claro, el mismo no tiene llamados a term_init, kbhit2, term_defaults.

  4. Viernes, 27 de Abril de 2012 a las 21:06 | #4

    @Adrian
    Gracias por tu comentario. Compilaste primero stermp.c ? Puedes probar también gcc -o proyecto proyecto.c stermp.c a ver qué tal.

    Saludos

  5. Viernes, 27 de Abril de 2012 a las 21:07 | #5

    @Gaspar Fernández
    Es bastante raro que no te deje compilar, a lo mejor te ha traicionado algún carácter en el copia y pega, tipo comillas o <>

    Saludos

  1. Miércoles, 30 de Junio de 2010 a las 11:32 | #1

Visita otras webs de la red