2011-06-21 6 views
5

私はOCamlでUnixプログラミングに慣れるための小さなユーティリティを書こうとしています。ここに私の試みはcatのためです:OCamlでのcatの作成:Unix.readの使用

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

Unix.readの返信(0を確認する以外は無視します)は、読んだ文字の数なので、そのバッファの多くの文字のみを使用してください。

本当に、低レベルのUnixのものを使用するのはどうですか?通常のOCamlファイルのオープンおよび読み取り機能を使用してみませんか?

+0

私は、このUnixモジュールについて語っている「Objective CamlによるUnixシステムプログラミング」を読んでいます。私は実際にそれを避けるべきですか? – rochem

+1

@rochemあなたの目的によって異なります。そのコースは、あなたが他の言語に移すことができるというUnixの知識を提供します(バッファとバッファサイズを渡し、返された文字の数をC言語の典型的な方法にする)。これらの呼び出しはC呼び出しと非常によく似ているので、通常のCamlプログラミングではほとんど使用されないため、このコースでは慣用的なOCamlプログラムの記述方法を教えません。 –

関連する問題