2009-10-30 14 views
8

Ze względu na edukację i praktykę programowania, chciałbym napisać prostą bibliotekę, która poradzi sobie z surowym wprowadzaniem z klawiatury, a także wyjściem do terminala w czasie rzeczywistym.Niebuforowane wejścia/wyjścia w ANSI C

Chciałbym trzymać się ansi C tak bardzo, jak to możliwe, po prostu nie mam pojęcia, gdzie zacząć coś takiego. Zrobiłem kilka wyszukiwań google, a 99% wyników korzysta z bibliotek lub są w C++.

Naprawdę chciałbym, aby działało w systemie Windows, a następnie przenieść go na OS X, gdy będę miał czas.

Odpowiedz

5

Trzymanie się standardem C w jak największym stopniu jest dobrym pomysłem, ale nie osiągniesz bardzo daleko z przyjętym zadaniem przy użyciu tylko standardu C. Mechanizmy uzyskiwania postaci z terminala pojedynczego są z natury platformą konkretny. W przypadku systemów POSIX (MacOS X) spójrz na nagłówek <termios.h>. Starsze systemy wykorzystują ogromną różnorodność nagłówków i wywołań systemowych, aby osiągnąć podobne efekty. Będziesz musiał zdecydować, czy masz zamiar wykonać jakąś specjalną obsługę postaci, pamiętając, że rzeczy takie jak "line kill" mogą pojawić się na końcu linii i zapakować wszystkie dotychczas wprowadzone postacie.

Dla Windows musisz zagłębić się w API WIN32 - w kodzie między Unix i Windows zasadniczo nie będzie żadnych wspólnych cech, przynajmniej tam, gdzie umieścisz "terminal" w trybie znak po znaku . Gdy masz mechanizm do odczytywania pojedynczych znaków, możesz zarządzać wspólnym kodem - prawdopodobnie.

Musisz też martwić się różnicami między znakami i naciśniętymi klawiszami. Na przykład, aby wpisać "ï" w systemie MacOS X, należy wpisać: opcja -u i i. To trzy kluczowe naciśnięcia.

+0

Obawiałem się, że to właśnie będę musiał zrobić ... Sądzę, że wezmę to ... jest win32API w windows.h? Dzięki za wskazówki .. :) –

2

To nie jest możliwe przy użyciu tylko standard ISO C, jednak można spróbować przy użyciu następujących:

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

i podobnych funkcji.

Jednak najlepiej jest użyć biblioteki ncurses.

+0

Istnieje również przyzwoity curses z otwartym źródłem dla okien; google "pdcurses". W ten sposób możliwe jest kodowanie przekleństw i kończy się czymś w działaniu na wszystkich platformach, o które pyta pytający - zrobiłem to. – asveikau

5

Aby ustawić otwartą strumień być buforowane przy użyciu non-ANSI C, można to zrobić:

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

(Reference: C89 4.9.5.6)

Jednak po tym jesteś na Twój własny. :-)

+1

Pierwszy argument setvbuf() to uchwyt pliku C, a nie deskryptor pliku. – ruief

+0

Użyłem tego przykładu i upewniłem się, że biblioteka C nie czyta więcej niż jest to konieczne ze strumienia, pozostawiając resztę strumienia nietkniętą dla kolejnych procesów w potoku. –