Небуферизованный ввод / вывод в ANSI C - PullRequest
8 голосов
/ 30 октября 2009

Ради образования и практики программирования я хотел бы написать простую библиотеку, которая может обрабатывать ввод с клавиатуры и выводить на терминал в режиме реального времени.

Я бы хотел как можно больше придерживаться ansi C, я просто не представляю, с чего начать. Я сделал несколько поисков в Google, и 99% результатов используют библиотеки, или для C ++.

Мне бы очень хотелось, чтобы он работал в Windows, а затем перенести его на OSX, когда у меня будет время.

Ответы [ 3 ]

5 голосов
/ 30 октября 2009

Как можно больше придерживаться стандартного C - хорошая идея, но вы не собираетесь слишком далеко продвигаться в своей принятой задаче, используя только стандартный C. Механизмы для получения символов из терминала по одному заведомо зависят от платформы. , Для систем POSIX (MacOS X) посмотрите заголовок <termios.h>. В старых системах используется большое количество заголовков и системных вызовов для достижения аналогичных эффектов. Вам нужно будет решить, собираетесь ли вы выполнять какую-либо специальную обработку символов, помня, что такие вещи, как «уничтожение строки», могут появляться в конце строки и убирать все введенные символы.

Для Windows вам нужно углубиться в WIN32 API - в коде между Unix и Windows практически не будет общего, по крайней мере, когда вы переводите «терминал» в посимвольный режим. Если у вас есть механизм для чтения отдельных символов, вы можете управлять общим кодом - возможно.

Также вам нужно беспокоиться о различиях между символами и нажатыми клавишами. Например, чтобы ввести 'ï' в MacOS X, введите option-u и i . Это три нажатия клавиш.

5 голосов
/ 30 октября 2009

Чтобы сделать открытый поток небуферизованным с помощью ANSI C, вы можете сделать это:

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

(ссылка: C89 4.9.5.6)

Впрочем, после этого ты сам по себе. : -)

2 голосов
/ 30 октября 2009

Это невозможно при использовании только стандартного ISO C. Однако вы можете попробовать использовать следующее:

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

и связанные с ними функции.

Лучше всего использовать библиотеку ncurses.

...