Написание cat в OCaml: использование Unix.read

Я пытаюсь написать небольшие утилиты, чтобы привыкнуть к программированию 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 каждый раз, когда заполняли буфер (который, в любом случае, все еще заполняет его некоторыми символами .. .); И что я должен делать? Спасибо.

5
задан rochem 21 June 2011 в 06:36
поделиться