2009-10-30 6 views
8

Aus Gründen der Ausbildung und Programmierpraxis möchte ich eine einfache Bibliothek schreiben, die rohe Tastatureingabe verarbeiten und in Echtzeit an das Terminal ausgeben kann.Unbuffered I/O in ANSI C

Ich würde gerne mit ansi C so viel wie möglich bleiben, ich habe einfach keine Ahnung, wo so etwas zu starten. Ich habe mehrere Google-Suchen durchgeführt, und 99% der Ergebnisse verwenden Bibliotheken oder sind für C++.

Ich würde wirklich gerne in Windows arbeiten, dann portiere es zu OSX, wenn ich Zeit habe.

Antwort

5

Es ist eine gute Idee, mit Standard C so weit wie möglich zu bleiben, aber Sie werden mit Ihrer angenommenen Aufgabe nicht sehr weit kommen, wenn Sie nur Standard C verwenden. Die Mechanismen, um Zeichen vom Terminal einzeln zu erhalten, sind von Natur aus Plattform Spezifisch. Sehen Sie sich für POSIX-Systeme (MacOS X) die Kopfzeile <termios.h> an. Ältere Systeme verwenden eine Vielzahl von Kopfzeilen und Systemaufrufen, um ähnliche Effekte zu erzielen. Du wirst dich entscheiden müssen, ob du eine spezielle Charakterbehandlung machst, denk daran, dass Dinge wie "Kill töten" am Ende der Zeile erscheinen und alle bisher eingegebenen Charaktere zappen können.

Für Windows müssen Sie in die WIN32-API eintauchen - es wird im Wesentlichen keine Gemeinsamkeit im Code zwischen Unix und Windows geben, zumindest dort, wo Sie das 'Terminal' in Zeichen-für-Zeichen-Modus setzen . Sobald Sie einen Mechanismus haben, um einzelne Zeichen zu lesen, können Sie wahrscheinlich gemeinsamen Code verwalten.

Außerdem müssen Sie sich Gedanken über die Unterschiede zwischen den Zeichen und den gedrückten Tasten machen. Um beispielsweise "ï" unter MacOS X einzugeben, geben Sie Option- und i ein. Das sind drei Tastendrücke.

+0

Ich hatte Angst, dass ich das tun müsste ... Ich schätze, ich werde es verstehen ... ist das win32API in windows.h? Danke für die Richtung .. :) –

2

Dies ist nicht nur möglich, Standard-ISO-C unter Verwendung Sie können jedoch versuchen, die mit folgenden:

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

und verwandten Funktionen.

Am besten verwenden Sie jedoch die Bibliothek ncurses.

+0

Es gibt auch eine anständige Open-Source-Flüche für Windows da draußen; google "pdcurses". Auf diese Weise ist es perfekt möglich, gegen Flüche zu kodieren und am Ende mit etwas zu arbeiten, das auf allen Plattformen, nach denen der Fragesteller fragt, funktioniert - ich habe es getan. – asveikau

5

einen offenen Strom einzustellen ungepufferten mit ANSI C zu sein, können Sie dies tun:

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

(Referenz: C89 4.9.5.6)

danach jedoch sind Sie auf dein eigenes. :-)

+1

Das erste Argument von setvbuf() ist ein C-Datei-Handle, kein Datei-Deskriptor. – ruief

+0

Ich habe dieses Beispiel verwendet und es funktioniert, um sicherzustellen, dass die C-Bibliothek nicht mehr liest, als aus dem Stream erforderlich ist, den Rest des Streams für nachfolgende Prozesse in der Pipe intakt lassen. –