Ocaml stdin上带有真正输入字符串的非法搜索

Ocaml stdin上带有真正输入字符串的非法搜索,ocaml,Ocaml,我正在修改一些代码,以接受来自stdin的输入(除了文件) 当我重定向stdin时,这会起作用:- $ ./a.out < /tmp/lorem.txt Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod 或:- 如何让后者也工作?您没有提到您正在使用的系统 Unix seek操作仅对常规文件有意义,即存储在磁盘(或类似的随机寻址介质)上的文件。在通常的Unix实现中,只会忽略终端设备或管道上

我正在修改一些代码,以接受来自stdin的输入(除了文件)

当我重定向stdin时,这会起作用:-

$ ./a.out < /tmp/lorem.txt 
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod 
或:-


如何让后者也工作?

您没有提到您正在使用的系统

Unix seek操作仅对常规文件有意义,即存储在磁盘(或类似的随机寻址介质)上的文件。在通常的Unix实现中,只会忽略终端设备或管道上的搜索。但是,在您使用的系统中,似乎这些都被视为错误。这使我怀疑您没有使用类Unix(或足够类Unix)系统

无论如何,问题似乎是
in_channel_length
查找文件的末尾以确定文件的大小。在您的系统中,当输入来自终端或管道时,这不起作用

即使在Unix系统上,当输入来自管道或终端时,也很难看到代码如何按预期工作

我建议您编写自己的循环,直到看到EOF为止

下面是一个对于文本文件来说可能足够好的粗略实现:

let my_really_read_string in_chan =
    let res = Buffer.create 1024 in
    let rec loop () =
        match input_line in_chan with
        | line ->
            Buffer.add_string res line;
            Buffer.add_string res "\n";
            loop ()
        | exception End_of_file -> Buffer.contents res
    in
    loop ()

是的,谢谢。这就是我最后做的。顺便说一句,我在Debian上。我刚刚在两个不同的Linux系统上试过,我确实看到了这个错误。我没有在macOS下看到它(这是我最初快速检查的地方)。很高兴知道,谢谢!
$ ./a.out
Fatal error: exception Sys_error("Illegal seek")
$
$ cat /tmp/lorem.txt | ./a.out 
Fatal error: exception Sys_error("Illegal seek")
let my_really_read_string in_chan =
    let res = Buffer.create 1024 in
    let rec loop () =
        match input_line in_chan with
        | line ->
            Buffer.add_string res line;
            Buffer.add_string res "\n";
            loop ()
        | exception End_of_file -> Buffer.contents res
    in
    loop ()