Написание кота в OCaml: использование Unix.read - PullRequest
5 голосов
/ 21 июня 2011

Я пытаюсь написать небольшие утилиты, чтобы привыкнуть к программированию в Unix с помощью OCaml. Вот моя попытка для cat:

    open Unix ;;

    let buffer_size = 10
    let buffer = String.create buffer_size

    let rec cat = function
      | [] -> ()
      | x :: xs ->
        let descr = openfile x [O_RDONLY] 0 in

        let rec loop () =
          match read descr buffer 0 buffer_size with
            | 0 -> ()
            | _ -> print_string buffer; loop () in
        loop ();
        print_newline ();
        close descr;
        cat xs ;;


    handle_unix_error cat (List.tl (Array.to_list Sys.argv))

Кажется, проблема в том, что при последнем вызове read буфер не заполняется полностью, так как больше нечего читать, конец того, что ранее содержалось в буфере, тоже печатается. Я прочитал несколько примеров кодов, используя read, и они, похоже, не использовали String.create каждый раз, когда заполняют буфер (который, в любом случае, все еще заполняет его некоторыми символами ...); И что же мне делать? Спасибо.

1 Ответ

4 голосов
/ 21 июня 2011

Возвращение Unix.read (которое вы игнорируете, за исключением проверки на 0) - это количество символов, которые вы прочитали, поэтому вы должны использовать только столько символов буфера.

Но на самом деле, зачем использовать низкоуровневые Unix-материалы? Почему бы не использовать обычные функции открытия и чтения файлов OCaml?

...