Нелегальный поиск с - PullRequest
       8

Нелегальный поиск с

0 голосов
/ 21 апреля 2020

Я модифицирую некоторый код для приема ввода от стандартного ввода (в дополнение к файлам).

print_string (really_input_string stdin (in_channel_length stdin))

Это работает, когда я перенаправляю стандартный ввод: -

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

Но в противном случае происходит сбой без ожидания ввода от меня: -

$ ./a.out
Fatal error: exception Sys_error("Illegal seek")
$

Или: -

$ cat /tmp/lorem.txt | ./a.out 
Fatal error: exception Sys_error("Illegal seek")

Как заставить последний также работать?

1 Ответ

1 голос
/ 21 апреля 2020

Вы не упоминаете, какую систему используете.

Операция поиска 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 ()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...