Рэкет 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). Это будет сигнализировать конец ввода.

Другие вопросы по тегам