2011-06-21 20 views
5

का उपयोग मैं ओकैम के साथ यूनिक्स प्रोग्रामिंग में उपयोग करने के लिए छोटी उपयोगिता लिखने की कोशिश कर रहा हूं। यहाँ cat के लिए मेरी कोशिश है:ओकैम में बिल्ली लिखना: यूनिक्स.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 की जांच के अलावा) उन वर्णों की संख्या है जिन्हें आपने पढ़ा है, इसलिए आपको केवल बफर के कई वर्णों का उपयोग करना चाहिए।

लेकिन वास्तव में, निम्न स्तर के यूनिक्स सामान का उपयोग क्यों परेशान करते हैं? क्यों नियमित OCaml फ़ाइल खोलने और पढ़ने के कार्यों का उपयोग नहीं करते?

+0

मैं "यूनिक्स सिस्टम प्रोग्रामिंग के साथ यूनिक्स सिस्टम प्रोग्रामिंग" पढ़ रहा हूं, जो इस यूनिक्स मॉड्यूल के बारे में बात कर रहा है। क्या मुझे वास्तव में इससे बचना चाहिए? – rochem

+1

@rochem यह आपके उद्देश्यों पर निर्भर करता है। वह कोर्स आपको यूनिक्स ज्ञान देगा कि आप अन्य भाषाओं में स्थानांतरित कर सकते हैं (एक बफर और बफर आकार पास कर सकते हैं और बदले में पढ़े गए वर्णों की संख्या प्राप्त करना सी में सामान्य तरीका है)। चूंकि ये कॉल सी कॉल को इतनी बारीकी से मेल खाते हैं, इसलिए वे सामान्य रूप से सामान्य कैमल प्रोग्रामिंग में कभी भी उपयोग नहीं किए जाते हैं, इसलिए यह कोर्स आपको सिखाएगा कि बेवकूफ ओकैम प्रोग्राम कैसे लिखना है। –

संबंधित मुद्दे