从输入端口读取球拍eof-object

时间:2011-02-02 17:04:22

标签: io scheme racket

我尝试从Racket中的输入端口读取字符串,但无论我使用什么API函数(readread-stringread-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 个答案:

答案 0 :(得分:3)

阅读参考:

  • read-char:“从in读取一个字符 - 可能涉及读取几个字节到UTF-8-将它们解码为一个字符。如果之前没有字节可用文件结尾,然后返回eof

  • read-string:“返回包含来自amt的下一个in个字符的字符串。如果在文件结尾之前没有可用字符,则{返回{1}}。

示例:

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)))))

希望有所帮助。

答案 1 :(得分:1)

如果从控制台输入输入,请尝试按 Ctrl + D (在Unix和MacOSX中)或 Ctrl + < kbd> Z ,然后输入(在Windows中)。这将表示输入结束。