Рэкет eof-объекта, считанный из входного порта - PullRequest
1 голос
/ 02 февраля 2011

Я пытался прочитать строку из входного порта в 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 ]

3 голосов
/ 02 февраля 2011

Чтение ссылки:

  • 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 ====
> 

Надеюсь, это поможет.

1 голос
/ 02 февраля 2011

Если вы вводите данные с консоли, попробуйте нажать Ctrl + D (в Unix и MacOSX) или Ctrl + Z , затем Введите (в Windows). Это будет сигнализировать конец ввода.

...