मैं किसी फ़ाइल में 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' बिट्स) को 'चार' में बदलने की कोशिश करते हैं तो हमारे पास 'के विपरीत कोई मूल्य नहीं होता है। अहस्ताक्षरित चार'। 'अहस्ताक्षरित चार' के साथ हमारे पास एक अमान्य/अपरिचित 'चार' मान है, लेकिन हमारे पास..."

यह विषय देखें फ़ाइल के बाइट रखने के लिए सबसे उपयुक्त प्रकार का वेक्टर कौन सा है? अधिक जानकारी के लिए!

4
Eduardo Lucio 15 अक्टूबर 2016, 01:26
यह समुदाय के लिए बहुत अच्छा है और जो इसे (मेरी तरह) समृद्ध करता है जब एक नकारात्मक स्पष्टीकरण या कारण के साथ आता है। इस तरह हम एक साथ चीजों में सुधार कर सकते हैं! अगर कुछ गड़बड़ है तो मैं इस धागे को ठीक कर सकता हूं या हटा सकता हूं। मुझे यकीन है कि हम समझदार लोग हैं।
 – 
Eduardo Lucio
16 अक्टूबर 2016, 18:44
"00000000" बिट्स (1 बाइट) "चार" प्रकार से पहचानने योग्य नहीं है। जब हम इन 8 बिट्स को "चार" में बदलने की कोशिश करते हैं तो हमारे पास "अहस्ताक्षरित चार" के विपरीत कोई मूल्य नहीं होता है। "हस्ताक्षरित चार" के साथ हमारे पास एक अमान्य/अपरिचित "चार" मान है, लेकिन हमारे पास है। मेरा सुझाव है कि stackoverflow.com/questions/40052857/…। धन्यवाद!
 – 
Eduardo Lucio
16 अक्टूबर 2016, 18:52

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 पर एक नल पॉइंटर पास नहीं कर सकते, वह यूबी है।

5
krzaq 18 अक्टूबर 2016, 18:22
मैं आपसे सहमत हूं। लेकिन जैसा कि हम इस धागे में देख सकते हैं "शीर्षक =" c एक फ़ाइल में एक stdvectorunsigned char की सामग्री को सहेजें"> बिट्स)। जब हम इन 8 बिट्स ("00000000" बिट्स) को "चार" में बदलने की कोशिश करते हैं तो हमारे पास "अहस्ताक्षरित चार" के विपरीत कोई मूल्य नहीं होता है। "हस्ताक्षरित चार" के साथ हमारे पास एक अमान्य/अपरिचित "चार" मान है, लेकिन हमारे पास है। धन्यवाद!
 – 
Eduardo Lucio
16 अक्टूबर 2016, 18:57
मुझे निम्न त्रुटि हो रही है: "त्रुटि: 'std :: ostreambuf_iterator <अहस्ताक्षरित चार> :: ostreambuf_iterator (std :: ofstream और)' पर कॉल के लिए कोई मिलान कार्य नहीं है"। विचार? ये कोड शामिल हैं: #include , #include , #include , #include , #include , #include , #include , #include , #include , #include , #include , #include
 – 
Eduardo Lucio
18 अक्टूबर 2016, 18:12
इसके बजाय ostreambuf_iterator<char>(file) आज़माएं।
 – 
krzaq
18 अक्टूबर 2016, 18:17
1
वैकल्पिक रूप से आप ostream_iterator<unsigned char>(file) (नहीं buf) का उपयोग कर सकते हैं। char के लिए यह इतना मायने नहीं रखता
 – 
krzaq
18 अक्टूबर 2016, 18:19
"ostream_iterator<अहस्ताक्षरित चार>(फ़ाइल)" पूरी तरह से काम किया! आप आदमी हो! धन्यवाद!
 – 
Eduardo Lucio
18 अक्टूबर 2016, 18:44