您的C有两个错误。首先,将EOF分配给
a
而不是比较
一
使用EOF。第二
getchar()
返回一个int。它明确返回一个int,以便返回EOF,一个不能用字符表示的值。您的代码(已更正第一个错误),其中
getchar()
测试前,将s值转换为char,将无法处理其中char值为255的文件:
$ gcc -Wall getchar.c -o getchar
$ echo -e "\xFF" > fake-eof
$ echo " " > space
$ ./getchar < fake-eof
eof
$ ./getchar < space
not eof
使用的技巧
getchar
返回int,即返回一个较大的类型,以便您的返回可以包含较小的类型和其他类型的信息,这在OCaml中是完全没有必要的,因为它的类型系统更高级。OCaml可能有
(* using hypothetical c_getchar, a wrapper for the getchar() in C that returns an int *)
let getchar_opt () =
match c_getchar () with
| -1 -> None
| c -> Some (char_of_int c)
let getchar_exn () =
match c_getchar () with
| -1 -> raise End_of_file
| c -> char_of_int c
type `a ior = EOF | Value of 'a
let getchar_ior () =
match c_getchar_ior () with
| -1 -> EOF
| c -> Value (char_of_int c)
当然
Pervasives.input_char
在OCaml中,会在EOF上引发异常,而不是执行这些其他操作之一。如果您想要一个非异常接口,可以
input_char
使用捕获异常的您自己的版本,或者根据您的程序,您可以使用
Unix.read
相反,它返回它能够读取的字节数,在EOF上为0。