如何将文件末尾附加到字符串
How to append end of file to a string
我刚刚点击 "problem": 有没有一种聪明的方法可以在字符串中插入文件结尾 (ASCII 0) 字符?
"smart" 是指比
更好的东西
let s = "foo" ^ (String.make 1 (Char.chr 0))
let s = "foo[=10=]0"
也就是说,反映我们正在添加 EOF,而不是 "mystery char which ascii value is 0"。
编辑:
嗯......确实我在搞乱eof是一个字符。但无论如何,在 C 中你可以有
#include <stdio.h>
int main(void)
{
char a = getchar();
if (a = EOF)
printf("eof");
else
printf("not eof");
return 0;
}
在哪里可以测试一个字符是否为 EOF((int) EOF
是 -1
,而不是我想的 0
)。同样的,你可以设置一个char为EOF等等。
我的问题是:在 ocaml 中是否可以有类似的东西?
正如@melpomene 所说,没有 EOF 字符,'\000' 真的只是一个字符。因此,据我所知,您的问题没有真正的答案。
您可以为仅由 NUL 字符组成的字符串定义您自己的名称(我们以前这样称呼它):
let eof = "[=10=]0"
那么你的函数看起来像这样:
let add_eof s = s ^ eof
你的C有两个错误。首先,您将 EOF 分配给 a
而不是将 a
与 EOF 进行比较。其次,getchar()
return 是一个整数。它 return 是一个明确的 int,因此它可以 return EOF,一个不能用 char 表示的值。您的代码(已更正第一个错误)在测试之前将 getchar()
s 值分配给一个字符,将无法处理其中包含一个字符值为 255 的文件:
$ gcc -Wall getchar.c -o getchar
$ echo -e "\xFF" > fake-eof
$ echo " " > space
$ ./getchar < fake-eof
eof
$ ./getchar < space
not eof
getchar
returning int 的技巧,returning 一个更大的类型,这样你的 return 可以包含较小的类型和其他类型的信息, 由于其更高级的类型系统,在 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)
当然,OCaml 中的 Pervasives.input_char
会在 EOF 上引发异常,而不是执行其他这些操作之一。如果你想要一个非异常接口,你可以用你自己的捕获异常的版本包装 input_char
,或者你可以 - 根据你的程序 - 使用 Unix.read
代替,returns它能够读取的字节数,在 EOF 上为 0。
我刚刚点击 "problem": 有没有一种聪明的方法可以在字符串中插入文件结尾 (ASCII 0) 字符?
"smart" 是指比
更好的东西let s = "foo" ^ (String.make 1 (Char.chr 0))
let s = "foo[=10=]0"
也就是说,反映我们正在添加 EOF,而不是 "mystery char which ascii value is 0"。
编辑: 嗯......确实我在搞乱eof是一个字符。但无论如何,在 C 中你可以有
#include <stdio.h>
int main(void)
{
char a = getchar();
if (a = EOF)
printf("eof");
else
printf("not eof");
return 0;
}
在哪里可以测试一个字符是否为 EOF((int) EOF
是 -1
,而不是我想的 0
)。同样的,你可以设置一个char为EOF等等。
我的问题是:在 ocaml 中是否可以有类似的东西?
正如@melpomene 所说,没有 EOF 字符,'\000' 真的只是一个字符。因此,据我所知,您的问题没有真正的答案。
您可以为仅由 NUL 字符组成的字符串定义您自己的名称(我们以前这样称呼它):
let eof = "[=10=]0"
那么你的函数看起来像这样:
let add_eof s = s ^ eof
你的C有两个错误。首先,您将 EOF 分配给 a
而不是将 a
与 EOF 进行比较。其次,getchar()
return 是一个整数。它 return 是一个明确的 int,因此它可以 return EOF,一个不能用 char 表示的值。您的代码(已更正第一个错误)在测试之前将 getchar()
s 值分配给一个字符,将无法处理其中包含一个字符值为 255 的文件:
$ gcc -Wall getchar.c -o getchar
$ echo -e "\xFF" > fake-eof
$ echo " " > space
$ ./getchar < fake-eof
eof
$ ./getchar < space
not eof
getchar
returning int 的技巧,returning 一个更大的类型,这样你的 return 可以包含较小的类型和其他类型的信息, 由于其更高级的类型系统,在 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)
当然,OCaml 中的 Pervasives.input_char
会在 EOF 上引发异常,而不是执行其他这些操作之一。如果你想要一个非异常接口,你可以用你自己的捕获异常的版本包装 input_char
,或者你可以 - 根据你的程序 - 使用 Unix.read
代替,returns它能够读取的字节数,在 EOF 上为 0。