मैं किसी फ़ाइल में std::vector<unsigned char>
की सामग्री लिखने के लिए "writeFileBytes" के नीचे दिए गए फ़ंक्शन का उपयोग करता हूं। मैं फ़ाइल को सहेजने के लिए "हस्ताक्षरित चार" प्रकार का उपयोग करना चाहता हूं (ध्यान दें कि "चार" के लिए एक कास्ट बनाया गया है)। उस प्रश्न का कारण यह है कि "अहस्ताक्षरित चार" में किसी भी बाइट ("00000000" बिट्स, उदाहरण के लिए) के साथ संगतता है। जब हम "चार" का उपयोग करते हैं तो हमें कुछ "अमान्य" वर्णों के हेरफेर के साथ कुछ समस्याएं होती हैं।
यह विषय देखें फ़ाइल के बाइट रखने के लिए सबसे उपयुक्त प्रकार का वेक्टर कौन सा है? "00000000" बिट्स (1 बाइट) वाले मुद्दों के बारे में अधिक जानकारी के लिए।
void writeFileBytes(const char* filename, std::vector<unsigned char>& fileBytes){
std::ofstream file(filename, std::ios::out|std::ios::binary);
file.write(fileBytes.size() ? (char*)&fileBytes[0] : 0,
std::streamsize(fileBytes.size()));
}
writeFileBytes("xz.bin", fileBytesOutput);
क्या फ़ाइल में लिखने के लिए मूल रूप से "अहस्ताक्षरित चार" प्रकार का उपयोग करने का कोई तरीका है?
यह चिंता वास्तव में समझ में आती है?
अपडेट I:
क्या फ़ाइल में लिखने के लिए मूल रूप से "अहस्ताक्षरित चार" प्रकार का उपयोग करने का कोई तरीका है? -> हाँ!
क्रज़ाक के दिशानिर्देशों के बाद!
void writeFileBytes(const char* filename, std::vector<unsigned char>& fileBytes){
std::ofstream file(filename, std::ios::out|std::ios::binary);
std::copy(fileBytes.cbegin(), fileBytes.cend(),
std::ostream_iterator<unsigned char>(file));
}
अद्यतन II:
यह चिंता वास्तव में समझ में आती है? -> कुछ मायनों में, हाँ!
जैसा कि मैं नीचे टिप्पणी करता हूं ...
"...'अहस्ताक्षरित चार' में 'उच्च स्तर की अनुकूलता' ('00000000' बिट्स शामिल हैं) लगती है। जब हम इन 8 बिट्स ('00000000' बिट्स) को 'चार' में बदलने की कोशिश करते हैं तो हमारे पास 'के विपरीत कोई मूल्य नहीं होता है। अहस्ताक्षरित चार'। 'अहस्ताक्षरित चार' के साथ हमारे पास एक अमान्य/अपरिचित 'चार' मान है, लेकिन हमारे पास..."
यह विषय देखें फ़ाइल के बाइट रखने के लिए सबसे उपयुक्त प्रकार का वेक्टर कौन सा है? अधिक जानकारी के लिए!
1 उत्तर
इससे कोई फर्क नहीं पड़ता, char*
का उपयोग किसी भी प्रकार के डेटा तक पहुंचने के लिए किया जा सकता है और यह सही ढंग से काम करेगा। लेकिन अगर आप स्पष्ट कलाकारों का उपयोग नहीं करना चाहते हैं, तो शायद std::copy
< का उपयोग करें /a> और std::ostreambuf_iterator
:
copy(fileBytes.cbegin(), fileBytes.cend(),
ostreambuf_iterator<char>(file));
वैकल्पिक रूप से, आप कॉल कर सकते हैं
copy(fileBytes.cbegin(), fileBytes.cend(),
ostream_iterator<char>(file));
लेकिन यह वही काम करेगा, केवल संभवतः धीमा।
बीटीडब्ल्यू: आप write
पर एक नल पॉइंटर पास नहीं कर सकते, वह यूबी है।
ostreambuf_iterator<char>(file)
आज़माएं।
ostream_iterator<unsigned char>(file)
(नहीं buf
) का उपयोग कर सकते हैं। char
के लिए यह इतना मायने नहीं रखता
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।