如何将文件末尾附加到字符串

时间:2017-12-29 23:29:32

标签: ocaml eof

我刚刚遇到“问题”:是否有一种智能方法可以在字符串中插入文件结尾(ASCII 0)字符?

“聪明”,我指的是比

更好的东西
let s = "foo" ^ (String.make 1 (Char.chr 0))
let s = "foo\000"

也就是反映我们正在添加EOF的东西,而不是“ascii值为0的神秘字符”。

修改: 嗯......事实上,我正在弄乱自己是个角色。但无论如何,在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中有类似的东西?

2 个答案:

答案 0 :(得分:4)

正如@melpomene所说,没有EOF角色,而且&#39; \ 000&#39;真的只是一个角色。因此,我的问题并没有真正的答案,就像我所知道的那样。

您可以为仅包含NUL字符的字符串定义您自己的名称(就像我们以前称之为):

let eof = "\000"

然后你的功能如下:

let add_eof s = s ^ eof

答案 1 :(得分:1)

你的C有两个错误。首先,您将EOF分配给a,而不是将a与EOF进行比较。其次,getchar()返回一个int。它明确地返回一个int,以便它可以返回EOF,这是一个不能用char表示的值。您的代码(纠正了第一个错误)在测试之前将getchar()的值赋给char,将无法处理其值为255的char的文件:

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

当然,OCaml中的Pervasives.input_char会在EOF上引发异常,而不是执行其他操作。如果你想要一个非特殊的接口,你可以用自己的版本包装input_char来捕获异常,或者你可以 - 取决于你的程序 - 改为使用Unix.read,它返回它的字节数能读,在EOF上是0。