2011-06-21 23 views
5

我正在嘗試編寫小型實用程序來習慣使用OCaml進行Unix編程。這是我對cat嘗試:在OCaml中寫入貓:使用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

我在閱讀「使用Objective Caml進行Unix系統編程」,它正在討論這個Unix模塊。我應該避免它嗎? – rochem

+1

@rochem這取決於你的目標。該課程將爲您提供Unix知識,您可以將其轉換爲其他語言(傳遞緩衝區和緩衝區大小,並獲取讀取的字符數是C中的典型方法)。因爲這些調用與C調用緊密匹配,所以它們在通常的Caml編程中幾乎從不使用,所以本課程不會教你如何編寫慣用的OCaml程序。 –