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

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。