Рэкет eof-объекта, считанный из входного порта
Я пытался прочитать строку из входного порта в Racket, но независимо от того, какие функции API я использовал для чтения (read
, read-string
, read-bytes
и т. д.), возвращаемое значение этих функций никогда не было равно eof-object
,
(define (some_process inp)
(begin
(let ([c (read-string 1 inp)])
(if (eof-object? c)
(begin
(display "EOF \n")
#f)
(if (equal? c "\n")
(begin
(display "NEWLINE \n"))
(some_process inp))))))
c
никогда не может быть eof-object
?
Если вы показываете, что c
это всегда перевод строки.
2 ответа
Прочитать ссылку:
read-char: "Читает один символ из
in
- что может включать чтение нескольких байтов для UTF-8-декодирования их в символ. Если до конца файла нет доступных байтов, тоeof
возвращается "read-string: "Возвращает строку, содержащую следующий
amt
персонажи изin
, Если до конца файла нет доступных символов, тоeof
возвращается "
Примеры:
> (read-char (open-input-string "char"))
#\c
> (read-string 50 (open-input-string "the string"))
"the string"
>
Но если в буфере нет символов, вы получите eof
:
> (read-char (open-input-string ""))
#<eof>
> (read-string 50 (open-input-string ""))
#<eof>
Я думаю, что вы просто хотите прочитать некоторое количество символов в цикле и что-то с ними сделать. Если это так, решение будет выглядеть примерно так:
(define (another-process inp)
(let ([c (read-char inp)])
(if (eof-object? c)
(begin (display "==== EOF ====") (newline))
(begin (display c) (newline)
(another-process inp)))))
Пример:
> (another-process (open-input-string "OK"))
O
K
==== EOF ====
> (another-process (open-input-string ""))
==== EOF ====
>
Обратите внимание на второй звонок another-process
с пустой строкой, он обнаруживает eof
немедленно и выходит из цикла.
РЕДАКТИРОВАТЬ: В случае, если вам нужно проверить, является ли прочитанный символ новой строки:
(define (process-moo inp)
(let ([c (read-char inp)])
(cond
((eof-object? c)
(display "==== EOF ====") (newline))
((eq? c #\newline)
(newline) (display "---- NEWLINE ----") (newline)
(process-moo inp))
(else
(display c)
(process-moo inp)))))
Пример:
> (call-with-input-string "Hello\nhumans\n!" process-moo)
Hello
---- NEWLINE ----
humans
---- NEWLINE ----
!==== EOF ====
>
Надеюсь, это поможет.
Если вы вводите данные с консоли, попробуйте нажать Ctrl+D (в Unix и MacOSX) или Ctrl+Z, затем Enter (в Windows). Это будет сигнализировать конец ввода.