我尝试从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
,则它始终是换行符。
答案 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中)。这将表示输入结束。