का बाइनरी संस्करण Iostreams का एक बाइनरी संस्करण लिख रहा है। यह अनिवार्य रूप से आपको बाइनरी फाइलें लिखने की अनुमति देता है, लेकिन आपको फ़ाइल के प्रारूप पर अधिक नियंत्रण देता है। उदाहरण उपयोग: (। जहां उपसर्ग u16le है)iostream
my_file << binary::u32le << my_int << binary::u16le << my_string;
एक अहस्ताक्षरित 32-बिट पूर्णांक के रूप में my_int लिख सकते हैं, और लंबाई-उपसर्ग के स्ट्रिंग के रूप में my_string फ़ाइल वापस पढ़ने के लिए, आप तीर फ्लिप जाएगा। बहुत अच्छा काम करता है। हालांकि, मैंने डिजाइन में एक टक्कर मार दी, और मैं अभी भी इसके बारे में बाड़ पर हूं। तो, एसओ पूछने का समय। (हम 8-बिट बाइट्स, 2 एस-पूरक इन्ट्स, और आईईईई इस समय फ्लोट्स की कुछ धारणाएं करते हैं।)
हुस्ट के तहत, iostreams, स्ट्रीमबफ का उपयोग करते हैं। यह वास्तव में एक शानदार डिजाइन है - iostreams कोड में 'int
' का क्रमबद्धीकरण कोड करता है, और अंतर्निहित स्ट्रीमबफ बाकी को संभालता है। इस प्रकार, आपको कोउट, एफस्ट्रीम, स्ट्रिंगस्ट्रीम इत्यादि मिलते हैं। इनमें से सभी, आईस्ट्रीम और स्ट्रीमबफ दोनों, आम तौर पर चार पर होते हैं, लेकिन कभी-कभी वेचर के रूप में भी। मेरा डेटा, हालांकि, एक बाइट स्ट्रीम है, जो सबसे अच्छा 'unsigned char
' द्वारा दर्शाया गया है।
मेरा पहला प्रयास unsigned char
पर आधारित कक्षाओं को टेम्पलेट करना था। std::basic_string
टेम्पलेट्स काफी अच्छी हैं, लेकिन streambuf
नहीं है। मैं codecvt
नामक कक्षा के साथ कई समस्याओं में भाग गया, जिसे मैं कभी भी unsigned char
विषय का पालन नहीं कर सका। यह दो प्रश्न उठाता है:
1) ऐसी चीजों के लिए एक स्ट्रीमबफ जिम्मेदार क्यों है? ऐसा लगता है जैसे कोड-रूपांतरण एक स्ट्रीमबफ की ज़िम्मेदारी से बाहर निकलते हैं - स्ट्रीमबफ को एक स्ट्रीम लेनी चाहिए, और उस से डेटा को बफर करना चाहिए। और कुछ नहीं। कोड रूपांतरणों के रूप में उच्च स्तर के रूप में कुछ ऐसा लगता है जैसे यह iostreams में होना चाहिए।
चूंकि मैं टेम्पलेटेड स्ट्रीमबफ को बिना हस्ताक्षर किए गए चार के साथ काम करने के लिए नहीं मिला, इसलिए मैं चार में वापस गया, और केवल char/unsigned char के बीच डेटा डाला। मैंने स्पष्ट कारणों से, जानवरों की संख्या को कम करने की कोशिश की। अधिकांश डेटा मूल रूप से एक पठन() या लिखने() फ़ंक्शन में घुमाता है, जो अंतर्निहित स्ट्रीमबफ का आह्वान करता है। (और प्रक्रिया में एक कास्ट का उपयोग करें।) पढ़ा गया कार्य मूल रूप से है:
size_t read(unsigned char *buffer, size_t size)
{
size_t ret;
ret = stream()->sgetn(reinterpret_cast<char *>(buffer), size);
// deal with ret for return size, eof, errors, etc.
...
}
अच्छा समाधान, खराब समाधान?
पहले दो प्रश्न इंगित करते हैं कि अधिक जानकारी की आवश्यकता है। सबसे पहले, बूस्ट :: क्रमबद्धरण जैसी परियोजनाओं को देखा गया था, लेकिन वे एक उच्च स्तर पर मौजूद हैं, जिसमें वे अपने स्वयं के द्विआधारी प्रारूप को परिभाषित करते हैं। यह निचले स्तर पर पढ़ने/लिखने के लिए अधिक है, जहां प्रारूप को परिभाषित करने की इच्छा है, या प्रारूप पहले ही परिभाषित किया गया है, या थोक मेटाडाटा आवश्यक या इच्छित नहीं है।
दूसरा, कुछ ने binary::u32le
संशोधक के बारे में पूछा है। यह उस वर्ग की तात्कालिकता है जो इस समय वांछित अंतराल और चौड़ाई रखती है, शायद भविष्य में हस्ताक्षर-नस्ल। धारा में उस वर्ग के अंतिम-पारित उदाहरण की प्रतिलिपि है, और इसे क्रमबद्ध करने में उपयोग किया जाता है। इस काम करने के लिए नहीं मालूम था
bostream &operator << (uint8_t n);
bostream &operator << (uint16_t n);
bostream &operator << (uint32_t n);
bostream &operator << (uint64_t n);
समय में
हालांकि,: यह एक वैकल्पिक हल का एक सा है, मैं orginally thusly < < ऑपरेटर ओवरलोडिंग की कोशिश की थी। अस्पष्ट कार्य कॉल के साथ मुझे कई समस्याएं थीं। यह विशेष रूप से स्थिरांक के बारे में सच था, हालांकि आप एक पोस्टर के रूप में सुझाव दे सकते थे, कास्ट कर सकते थे या इसे const <type>
के रूप में घोषित कर सकते थे। मुझे याद है कि हालांकि कुछ और बड़ी समस्या थी।
आपकी संदिग्ध फ़ंक्शन कॉल समस्या इस तथ्य के कारण हो सकती है कि [u] int32_t को आमतौर पर "[हस्ताक्षरित] लंबा" के रूप में परिभाषित किया जाता है। तो यदि आप एक "[हस्ताक्षरित] int" लिखने का प्रयास करते हैं, जो संख्यात्मक अक्षर होते हैं, तो पदोन्नति आवश्यक है, लेकिन प्रचार करने के लिए प्रकार संदिग्ध है (उदाहरण के लिए लंबे बनाम डबल)। –
क्या आप कृपया उन संघर्षों पर कंपाइलर आउटपुट पोस्ट कर सकते हैं जिनके साथ आपने हस्ताक्षर किए गए चार स्ट्रीमबफ के साथ किया था? – Basilevs