代码之家  ›  专栏  ›  技术社区  ›  Bromind

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

  •  0
  • Bromind  · 技术社区  · 7 年前

    我刚刚碰到了一个“问题”:有没有一种聪明的方法可以在字符串中插入文件结尾(ASCII 0)字符?

    我说的“聪明”是指比

    let s = "foo" ^ (String.make 1 (Char.chr 0))
    let s = "foo\000"
    

    也就是说,这反映了我们正在添加EOF,而不是“ascii值为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中是否可能有类似的东西?

    2 回复  |  直到 7 年前
        1
  •  6
  •   Jeffrey Scofield    7 年前

    正如@melpomene所说,没有EOF字符,“\000”实际上只是一个字符。所以就我所知,你的问题没有真正的答案。

    您可以为仅由NUL字符组成的字符串定义自己的名称(我们以前称之为):

    let eof = "\000"
    

    那么您的函数如下所示:

    let add_eof s = s ^ eof
    
        2
  •  1
  •   Julian Fondren    7 年前

    您的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。