Day: January 25, 2013

Como ler do teclado de forma nao bufferizada

Como vocês devem saber o teclado possui um buffer circular que armazena os últimos caracteres digitados, então quando você lê uma tecla digitada, provavelmente ela não é a tecla que o usuário digitou neste exato momento, mas sim o código da tecla mais antiga existente no buffer.

Isto é bom para a maioria das aplicações, como por exemplo editores de texto, mas com certeza não é uma boa solução para jogos estilo arcade (ex. River Raider) e não para aplicações de controle de tempo-real.

Felizmente é possível ignorar ou minimixar os efeitos do buffer do teclado.

Este código abaixo faz exatamente isso pra você:

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>

int main()
{
    struct termios oldSettings, newSettings;

    tcgetattr( fileno( stdin ), &oldSettings );
    newSettings = oldSettings;
    newSettings.c_lflag &= (~ICANON & ~ECHO);
    tcsetattr( fileno( stdin ), TCSANOW, &newSettings );    

    while ( 1 )
    {
        fd_set set;
        struct timeval tv;

        tv.tv_sec = 10;
        tv.tv_usec = 0;

        FD_ZERO( &set );
        FD_SET( fileno( stdin ), &set );

        int res = select( fileno( stdin )+1, &set, NULL, NULL, &tv );

        if( res > 0 )
        {
            char c;
            printf( "Input available\n" );
            read( fileno( stdin ), &c, 1 );
        }
        else if( res < 0 )
        {
            perror( "select error" );
            break;
        }
        else
        {
            printf( "Select timeout\n" );
        }
    }

    tcsetattr( fileno( stdin ), TCSANOW, &oldSettings );
    return 0;
}

Fonte: http://www.cplusplus.com/forum/beginner/5619/#msg25139