file io - Recommendations for a C++ polymorphic, seekable, binary I/O interface -
मैं std :: istream
और ostream
का उपयोग कर रहा हूं सी ++ में यादृच्छिक-एक्सेस बाइनरी I / O के लिए एक बहुरूपभूत इंटरफ़ेस, लेकिन यह कई तरीकों से उपोष्णतम लगता है:
- 64-बिट की तलाश स्ट्रैम्पोस / स्ट्रीमिंग सीमाओं के कारण गैर-पोर्टेबल और त्रुटि-प्रवण है ; वर्तमान में एक वैकल्पिक हल के रूप में उपयोग कर रहा है, लेकिन इसे सतर्कता की आवश्यकता है
- लापता परिचालन जैसे कि एक फ़ाइल को छानना या विस्तार करना (एला पॉसिक्स
ftruncate
) - कंक्रीट कार्यान्वयन के बीच असंगति; जैसे
stringstream
स्वतंत्र प्राप्त / स्थिति रखता है जबकिfilestream
नहीं करता है - मंच कार्यान्वयन के बीच असंगति; जैसे
failbit
/badbit
पर - फाइल के अंत में उत्तीर्ण करने का प्रयास या
की सभी स्वरूपण सुविधाओं की आवश्यकता नहीं है धारा
या संभवतःstreambuf
-
streambuf
त्रुटि रिपोर्टिंग (यानी अपवाद को एक त्रुटि सूचक देकर) के बफ़रिंग प्रथा में माना जाता है
मुझे उपलब्ध कराए गए सरलीकृत इंटरफ़ेस को पसंद है, लेकिन यह बहुरूपिक वर्ग के बजाय फ़ंक्शन टेम्पलेट के रूप में प्रदान किया गया है। (यह एक है, लेकिन यह बहुरूपक नहीं है और यह सिर्फ एक कार्यान्वयन सहायक वर्ग है जो कि आपूर्ति की गई डिवाइस के उपयोग से जरूरी नहीं है।) मैं मुख्यतः बड़ी डिस्क फ़ाइलों का उपयोग कर रहा हूं, लेकिन मैं वास्तव में बहुरूपता चाहता हूं ताकि मैं आसानी से वैकल्पिक कार्यान्वयन (उदाहरण के लिए उपयोग कर सकता हूँ)
किसी भी व्यक्ति की किसी भी सिफारिश की कोई भी सिफारिशों के बिना stringstream
इकाई परीक्षण के लिए fstream
के बजाय)। इस के लिए मानक दृष्टिकोण? यह एक आम स्थिति की तरह लगता है, इसलिए मैं अपने स्वयं के इंटरफेस का अनावश्यक रूप से आविष्कार नहीं करना चाहता। एक उदाहरण के रूप में, java.nio जैसे कुछ। फ़िल चाइनाल आदर्श लगता है।
अब तक का सबसे अच्छा समाधान बूस्ट के शीर्ष पर एक पतली बहुरूपक परत डालना है। Iostreams डिवाइस उदाहरण के लिए:
class my_istream {सार्वजनिक: वर्चुअल std :: streampos seek (stream_offset off, std :: ios_base :: seekdir way) = 0; वर्चुअल std :: streamsize पढ़ा (char * s, std :: streamsize n) = 0; आभासी शून्य बंद () = 0; }; टेम्पलेट & lt; कक्षा T & gt; Class boost_istream: सार्वजनिक my_istream {सार्वजनिक: boost_istream (const & amp; उपकरण): m_device (डिवाइस) {} वर्चुअल std :: streampos seek (stream_offset off, std :: ios_base :: seekdir way) {return boost :: iostreams :: seek (M_device, बंद, रास्ता); } आभासी std :: streamsize पढ़ा (char * s, std :: streamsize n) {return boost :: iostreams :: read (m_device, s, n); } आभासी शून्य बंद () {boost :: iostreams :: close (m_device); } निजी: टी एम_डिवाइस; };
क्या आपके पास एक क्यूटी के क्यूआईडीवियस क्लास और उपवर्ग देखा गया है? मुझे पूरा यकीन नहीं है कि यह आपकी ज़रूरतों को पूरा करता है, लेकिन हो सकता है कि इसके लिए एक प्रयास करें:।
Comments
Post a Comment