Как реализовать (char-ready?) В C - PullRequest
8 голосов
/ 01 июня 2011

В настоящее время я внедряю Scheme R5RS в C, и я застрял, пытаясь реализовать функцию (char-ready?).

У меня есть спецификации для функции, приведенной ниже.Функция гарантированно не блокируется.Стандартные функции C, такие как fgetc (), блокируют все входные данные при вызове, когда нет готовых входных данных.

Кто-нибудь знает, есть ли способ реализовать это простым и приятным способом, не создавая выделенный поток ввода-вывода?

Редактировать: Мой тип входного потока - ФАЙЛ *, который может быть stdin или файлом, открытым с помощью fopen ().

(готовая к работе?) Процедура

(char-ready? Port) процедура

Возвращает #t, если символ готов к входному порту, и возвращает #f в противном случае.Если char-ready возвращает #t, то следующая операция read-char на данном порту гарантированно не будет зависать.Если порт находится в конце файла, то он готов к загрузке?возвращает #t.Порт может быть опущен, в этом случае по умолчанию используется значение, возвращаемое текущим входным портом.

Обоснование:

Готов к Char?существует для того, чтобы программа могла принимать символы из интерактивных портов, не застревая в ожидании ввода.Любые входные редакторы, связанные с такими портами, должны гарантировать, что символы, существование которых было подтверждено char-ready?нельзя стиратьЕсли вы готовы?если в конце файла вернуть #f, порт в конце файла будет неотличим от интерактивного порта без готовых символов.

Ответы [ 3 ]

5 голосов
/ 02 июня 2011

Вам нужно будет опуститься ниже уровня stdio.В UNIX вы можете использовать fileno() для получения дескриптора файла, связанного с потоком, а затем вы можете использовать системные вызовы select() и read() для неблокирующих операций чтения.

2 голосов
/ 02 июня 2011

Возможно, что-то вроде кода в этом ответе ?Но отметьте с ungetc «гарантирован только один возврат».

В качестве примечания, большинство серьезных реализаций схем в конечном итоге выполняют свои собственные буферизованные (возможно, неблокирующие) операции ввода-вывода.

2 голосов
/ 02 июня 2011
...