2015-01-21 10 views
5

फोबोस में फ़ाइल I/O API अपेक्षाकृत आसान है, लेकिन अभी मुझे लगता है कि यह डी के रेंज इंटरफ़ेस के साथ बहुत अच्छी तरह से एकीकृत नहीं है।फ़ाइल से आलसी-मूल्यांकन श्रेणी कैसे बनाएं?

मैं एक सीमा एक सरणी में पूरी फ़ाइल को पढ़ कर पूर्ण सामग्री परिसीमन बना सकते हैं: के लिए

import std.file; 
auto mydata = cast(ubyte[]) read("filename"); 
processData(mydata); // takes a range of ubytes 

लेकिन डेटा अवांछित हो सकता है की इस उत्सुक मूल्यांकन करता है, तो मैं केवल एक फ़ाइल का हेडर प्राप्त करना चाहते हैं, उदाहरण। upTo पैरामीटर इस समस्या को हल नहीं करता है अगर फ़ाइल का स्वरूप एक चर-लंबाई वाला हेडर या कोई अन्य तत्व मानता है जिसे हम पुनर्प्राप्त करना चाहते हैं। यह फ़ाइल के बीच में भी हो सकता है, और read मुझे उस बिंदु तक की सभी फाइलों को पढ़ने के लिए मजबूर करता है।

लेकिन वास्तव में, विकल्प हैं। readf, readln, byLine और सबसे विशेष रूप से byChunk मुझे डेटा के टुकड़े पुनर्प्राप्त करने दें जब तक कि मैं फ़ाइल के अंत तक नहीं पहुंच जाता, या बस जब मैं फ़ाइल को पढ़ना बंद करना चाहता हूं।

import std.stdio; 
File file("filename"); 
auto chunkRange = file.byChunk(1000); // a range of ubyte[]s 
processData(chunkRange); // oops! not expecting chunks! 

लेकिन अब मैं बाइट्स की एक सतत श्रृंखला डेटा की निश्चित आकार हिस्सा है, बजाय के साथ काम की जटिलता पेश किया है।

तो मैं आलसी मूल्यांकन की गई फ़ाइल से बाइट्स की एक साधारण इनपुट रेंज कैसे बना सकता हूं, या तो पात्रों या छोटे हिस्सों द्वारा (पढ़ने की संख्या को कम करने के लिए)? क्या दूसरे उदाहरण में रेंज निर्बाध रूप से इस तरह से encapsulated किया जा सकता है कि डेटा को पहले उदाहरण में संसाधित किया जा सकता है?

उत्तर

7

आप std.algorithm.joiner उपयोग कर सकते हैं:

auto r = File("test.txt").byChunk(4096).joiner(); 

ध्यान दें कि byChunk प्रत्येक हिस्सा के लिए एक ही बफर पुनः उपयोग कर लेता है, तो आप .map!(chunk => chunk.idup) जोड़ने के लिए lazily ढेर करने के लिए हिस्सा कॉपी करने के लिए आवश्यकता हो सकती है।

+0

ऐसा लगता है कि प्रत्येक खंड को अपनी स्मृति स्थान पर मैप किए बिना काम करना प्रतीत होता है। आखिरकार, एक 'इनपुट रेंज' पहले ही अनुक्रमिक एक बार पढ़ने की अपेक्षा करता है। क्या आप ऐसे मामले के बारे में सोच सकते हैं जहां वास्तव में इसकी आवश्यकता है? –

+0

शायद आप कभी भी इसकी आवश्यकता नहीं है जैसा कि आप कहते हैं। –

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