5

OCamlを使ったUnixプログラミングに慣れるための小さなユーティリティを書こうとしています。これが私の試みです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だから私は何をすべきですか?ありがとう。

4

1 に答える 1

4

(0をチェックすることを除いて無視する)の戻り値Unix.readは、読み取った文字数であるため、バッファーのその数の文字のみを使用する必要があります。

しかし、実際には、なぜ低レベルのUnixのものをわざわざ使用するのでしょうか。通常のOCamlファイルを開いたり読んだりする機能を使ってみませんか?

于 2011-06-21T07:24:43.670 に答える