Небуферизованный ввод / вывод в ANSI C
Ради образования и практики программирования я хотел бы написать простую библиотеку, которая может обрабатывать ввод с клавиатуры и выводить данные на терминал в режиме реального времени.
Я бы хотел как можно больше придерживаться ANSI C, я просто не знаю, с чего начать. Я сделал несколько поисков в Google, и 99% результатов используют библиотеки или для C++.
Мне бы очень хотелось, чтобы он работал в Windows, а затем перенести его на OSX, когда у меня будет время.
3 ответа
Хорошая идея придерживаться стандартного C - это хорошая идея, но вы не будете слишком далеко продвигаться в своей принятой задаче, используя только стандарт C. Механизмы для получения символов от терминала по одному являются по сути платформо-зависимыми. Для систем POSIX (MacOS X) посмотрите на <termios.h>
заголовок. В старых системах для достижения аналогичных эффектов используется огромное количество заголовков и системных вызовов. Вам нужно будет решить, собираетесь ли вы выполнять какую-либо специальную обработку символов, помня, что такие вещи, как "уничтожение строки", могут появляться в конце строки и убирать все введенные символы.
Для Windows вам нужно углубиться в WIN32 API - в коде между Unix и Windows практически не будет общего, по крайней мере, когда вы переводите "терминал" в посимвольный режим. Если у вас есть механизм для чтения отдельных символов, вы можете управлять общим кодом - возможно.
Также вам нужно будет позаботиться о различиях между символами и нажатыми клавишами. Например, чтобы ввести "ï" в MacOS X, введите option-u и i. Это три нажатия клавиш.
Чтобы установить открытый поток без буферизации с использованием ANSI C, вы можете сделать это:
#include <stdio.h>
if (setvbuf(fd, NULL, _IONBF, 0) == 0)
printf("Set stream to unbuffered mode\n");
(Ссылка: C89 4.9.5.6)
Однако после этого вы по своему усмотрению.:-)
Это невозможно при использовании только стандартного ISO C. Однако вы можете попробовать использовать следующее:
#include <stdio.h>
void setbuf(FILE * restrict stream, char * restrict buf);
и связанные функции.
Хотя лучше всего использовать ncurses
библиотека.