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

Popular posts from this blog

windows - Heroku throws SQLITE3 Read only exception -

lex - Building a lexical Analyzer in Java -

python - rename keys in a dictionary -