2009-10-30 28 views
8

Por cuestiones de educación y práctica de programación, me gustaría escribir una biblioteca simple que pueda manejar la entrada de teclado sin procesar y enviarla a la terminal en "tiempo real".E/S sin búfer en ANSI C

Me gustaría seguir con ansi C tanto como sea posible, simplemente no tengo idea de por dónde empezar algo como esto. He realizado varias búsquedas en Google, y el 99% de los resultados usan bibliotecas, o son para C++.

Me gustaría ponerlo en funcionamiento en Windows, y luego llevarlo a OSX cuando tenga tiempo.

Respuesta

5

Cumplir con el estándar C tanto como sea posible es una buena idea, pero no va a llegar muy lejos con su tarea adoptada usando solo el estándar C. Los mecanismos para obtener caracteres del terminal uno a la vez son intrínsecamente plataforma específico. Para los sistemas POSIX (MacOS X), mire el encabezado <termios.h>. Los sistemas antiguos usan una gran variedad de encabezados y llamadas al sistema para lograr efectos similares. Tendrás que decidir si vas a hacer algún manejo especial del personaje, recordando que cosas como 'line kill' pueden aparecer al final de la línea y borrar todos los caracteres ingresados ​​hasta el momento.

Para Windows, tendrá que profundizar en la API de WIN32 - esencialmente no habrá nada en común en el código entre Unix y Windows, al menos donde pone el 'terminal' en modo de carácter por carácter . Una vez que tienes un mecanismo para leer caracteres individuales, puedes administrar código común, probablemente.

Además, tendrá que preocuparse por las diferencias entre los caracteres y las teclas presionadas. Por ejemplo, para ingresar 'ï' en MacOS X, escriba option-u y i. Son tres pulsaciones de teclas.

+0

Me temo que eso es lo que tendría que hacer ... supongo que lo abordaré ... ¿es win32API en windows.h? Gracias por la dirección ... :) –

2

esto no es posible utilizando sólo la norma ISO C. Sin embargo, se puede tratar de usar la siguiente:

#include <stdio.h> 
void setbuf(FILE * restrict stream, char * restrict buf); 

y funciones relacionadas.

Sin embargo, su mejor opción es utilizar la biblioteca ncurses.

+0

También hay una fuente decente de código abierto para ventanas; google "pdcurses". De esa manera, es perfectamente posible codificar contra maldiciones y terminar con algo que funciona en todas las plataformas que el interrogador pregunta: lo he hecho. – asveikau

5

Para establecer un flujo abierto a ser no tamponada utilizando ANSI C, puede hacer esto:

#include <stdio.h> 
if (setvbuf(fd, NULL, _IONBF, 0) == 0) 
    printf("Set stream to unbuffered mode\n"); 

(Referencia: C89 4.9.5.6)

Sin embargo, después de que estás en tu propio. :-)

+1

El primer argumento de setvbuf() es un identificador de archivo C, no un descriptor de archivo. – ruief

+0

He utilizado este ejemplo y funciona para garantizar que la biblioteca C no lea más de lo necesario de la secuencia, dejando el resto de la secuencia intacta para los procesos posteriores en la tubería. –