I/O senza buffer in ANSI C
-
22-07-2019 - |
Domanda
Per motivi di istruzione e pratica di programmazione, mi piacerebbe scrivere una semplice libreria in grado di gestire input da tastiera grezzi e output sul terminale in "tempo reale".
Mi piacerebbe restare con ansi C il più possibile, semplicemente non ho idea da dove cominciare per qualcosa del genere.Ho effettuato diverse ricerche su Google e il 99% dei risultati utilizza librerie o riguarda C++.
Mi piacerebbe davvero farlo funzionare su Windows, quindi trasferirlo su OSX quando avrò tempo.
Soluzione
Attenersi il più possibile allo standard C è una buona idea, ma non andrai molto lontano con il compito adottato utilizzando solo lo standard C.I meccanismi per ottenere i caratteri dal terminale uno alla volta sono intrinsecamente specifici della piattaforma.Per i sistemi POSIX (MacOS X), guarda il file <termios.h>
intestazione.I sistemi più vecchi utilizzano un'ampia varietà di intestazioni e chiamate di sistema per ottenere effetti simili.Dovrai decidere se eseguire una gestione speciale dei caratteri, ricordando che cose come "line kill" possono apparire alla fine della riga e eliminare tutti i caratteri inseriti finora.
Per Windows, dovrai approfondire l'API WIN32: essenzialmente non ci sarà alcuna comunanza nel codice tra Unix e Windows, almeno dove metti il "terminale" in modalità carattere per carattere.Una volta che hai un meccanismo per leggere singoli caratteri, puoi gestire il codice comune, probabilmente.
Inoltre, dovrai preoccuparti delle differenze tra i caratteri e i tasti premuti.Ad esempio, per inserire "ï" su MacOS X, devi digitare opzione-u E io.Sono tre i tasti premuti.
Altri suggerimenti
Per impostare un flusso aperto in modo che non sia bufferizzato usando ANSI C, puoi farlo:
#include <stdio.h>
if (setvbuf(fd, NULL, _IONBF, 0) == 0)
printf("Set stream to unbuffered mode\n");
(Riferimento: C89 4.9.5.6)
Tuttavia, dopo quello sei da solo. : -)
Questo non è possibile utilizzando solo lo standard ISO C. Tuttavia, puoi provare a utilizzare quanto segue:
#include <stdio.h>
void setbuf(FILE * restrict stream, char * restrict buf);
e funzioni correlate.
La soluzione migliore è utilizzare la ncurses
libreria.