Небуферизованный ввод / вывод в ANSI C
-
22-07-2019 - |
Вопрос
Ради образования и практики программирования я хотел бы написать простую библиотеку, которая может обрабатывать ввод с клавиатуры и выводить данные на терминал в режиме реального времени.
Я бы хотел как можно больше придерживаться ANSI C, я просто не представляю, с чего начать. Я провел несколько поисков в Google, и 99% результатов используют библиотеки или предназначены для C ++.
Мне бы очень хотелось, чтобы он работал в Windows, а затем перенести его на OSX, когда у меня будет время.
Решение
Хорошая идея - придерживаться максимально возможного стандартного C, но вы не собираетесь слишком далеко продвигаться в своей принятой задаче, используя только стандартный C. Механизмы получения символов из терминала по одному заведомо зависят от платформы. , Для систем POSIX (MacOS X) посмотрите <termios.h>
заголовок. В старых системах используется большое количество заголовков и системных вызовов для достижения аналогичных эффектов. Вам нужно будет решить, собираетесь ли вы выполнять какие-либо специальные операции с символами, помня, что такие вещи, как «уничтожение строки», могут появляться в конце строки и убирать все введенные символы.
Для Windows вам нужно углубиться в API-интерфейс WIN32 - в коде между Unix и Windows практически не будет общего, по крайней мере, когда вы переводите «терминал» в посимвольный режим. Если у вас есть механизм для чтения отдельных символов, вы можете управлять общим кодом - возможно.
Кроме того, вам нужно беспокоиться о различиях между символами и нажатыми клавишами. Например, чтобы ввести «& # 239;» в 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
.