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

问题描述 投票:0回答:2

我刚刚遇到“问题”:是否有一种智能方法可以在字符串中插入文件结尾(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中有类似的东西?

ocaml eof
2个回答
1
投票

你的C有两个错误。首先,您将EOF分配给a,而不是将a与EOF进行比较。其次,getchar()返回一个int。它明确地返回一个int,以便它可以返回EOF,这是一个不能用char表示的值。您的代码(第一个错误已更正)在测试之前将getchar()s值分配给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,它返回它能够读取的字节数,即0在EOF上。


4
投票

正如@melpomene所说,没有EOF字符,'\ 000'真的只是一个字符。所以对于你的问题我没有真正的答案。

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

let eof = "\000"

然后你的函数看起来像这样:

let add_eof s = s ^ eof
© www.soinside.com 2019 - 2024. All rights reserved.