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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top