Вы не упоминаете, какую систему используете.
Операция поиска Unix имеет смысл только для обычных файлов, т. Е. Файлов, хранящихся на диске (или аналогичных случайно адресуемых носителях). В обычной реализации Unix поиск терминального устройства или канала просто игнорируется. Однако, похоже, что в используемой вами системе они рассматриваются как ошибка. Это заставляет меня подозревать, что вы не используете Unix -подобную (или достаточно Unix -подобную) систему.
В любом случае проблема, по-видимому, заключается в том, что in_channel_length
стремится к концу файл, чтобы определить, насколько он большой. В вашей системе это не работает, когда ввод поступает с терминала или канала.
Трудно увидеть, как код будет работать, как ожидается, даже в системе Unix, когда ввод поступает из канала. или терминал.
Я предлагаю вам написать свой l oop для чтения, пока не увидите 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 ()