2011-06-21 11 views
5

Unix programlama ile OCaml'a alışmak için küçük yardımcı programlar yazmaya çalışıyorum. İşte cat benim deneyin bulunuyor:OCaml'de kedi yazma: Unix.read'in kullanımı

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)) 

Sorun okumak için başka bir şey, tampon önceden içerdiği şeyin sonu var çünkü read son çağrı, tampon tamamen doldurmaz, olması gibi görünüyor da basılır. Ben read kullanarak birkaç örnek kodları okudum ve arabellek her doldurduktan sonra String.create kullanmadılar (ki, yine de, bazı karakterler ile doldurur ...); Peki ne yapmalıyım? Teşekkürler.

cevap

4

Unix.read'un (yoksaymanız, 0'ı denetleme hariç) dönüşü, okuduğunuz karakter sayısıdır, bu nedenle yalnızca arabelleğin çok sayıda karakterini kullanmanız gerekir.

Ama aslında, neden düşük seviyeli Unix malzemelerini kullanarak rahatsız etmiyorsunuz? Neden düzenli OCaml dosya açma ve okuma işlevlerini kullanmıyorsunuz?

+0

Bu Unix modülü hakkında konuşan "Objective Caml ile Unix sistem programlaması" okuyorum. Bundan gerçekten kaçmalı mıyım? – rochem

+1

@rochem Bu, hedeflerinize bağlıdır. Bu kurs size Unix bilgisi verecek ve diğer dillere aktarılabilecektir (bir arabellek ve arabellek büyüklüğünden geçerek, okunan karakterlerin sayısını elde etme C'deki tipik yoldur). Bu çağrılar C çağrıları ile çok yakından eşleştiğinden, her zamanki gibi Caml programlamada neredeyse hiç kullanılmazlar, bu nedenle bu dersin size öğretmeyeceği şey, deyimsel OCaml programlarının nasıl yazılacağıdır. –