2015-09-01 11 views
7

में मैं std :: ofstream() का उपयोग कर एक यूटीएफ -16 एन्कोडेड फ़ाइल लिखने की कोशिश कर रहा हूं। बाइनरी मोड लेखन में भी "\n\0""\r\n\0" के रूप में लिखा गया है। नमूना कोड:std :: ऑफ़स्ट्रीम लिखता है r बाइनरी मोड

std::string filename = ... 
std::ofstream fout(filename, std::ios_base::binary); 
fout.write("\xff\xfe", 2); 
fout.write("\n\0", 2); 
fout.close(); 

परिणामी फ़ाइल के हेक्स डेटा है:

ff fe 0d 0a 00 

मैं कुछ गलत कर किया जाना चाहिए। 0x0d लिखा जा रहा है रोकने के लिए कोई विचार?

मैं उपयोग कर रहा हूँ एमएस VisualStudio 2013.

अद्यतन: यह बेवजह काम करना शुरू किया अपेक्षा के अनुरूप। मशीन में भूत तक चॉकलेट करें।

+0

बाइनरी मोड में कोई अनुवाद नहीं होना चाहिए । यदि कोई अनुवाद है तो कहीं कोई त्रुटि है। –

+1

'fout.write (" \ x0a \ 0 ", 2) के बारे में क्या;'? –

+0

यह काम करेगा, लेकिन ओपी इस बारे में गलत तरीके से जा रहा है। इस पथ से केवल अधिक दर्द और दुख और यूनिकोड गेटचास का कारण बन जाएगा। –

उत्तर

-4

यह डिज़ाइन द्वारा है। \ N चरित्र को आपके प्लेटफॉर्म के लिए ईओएल मार्कर में परिवर्तित किया जाता है और इसलिए ऑफस्ट्रीम :: लेखन फ़ंक्शन सही ढंग से व्याख्या कर रहा है। यदि आप एक बाइनरी फ़ाइल लिखना चाहते हैं, तो आप विशेष टेक्स्ट वर्णों का उपयोग नहीं कर सकते हैं।

स्पष्टीकरण: मैं संकलक क्या कर रहा हूं उस पर थोड़ा उलझन में कामयाब रहा। असल में, \ n एक विशेष चरित्र है जिसका अर्थ है "ईओएल/लाइन ऑफ एंड" यह आपके संकलन के प्लेटफॉर्म पर निर्भर करता है।

अब लिखने() फ़ंक्शन स्ट्रीम को लिखने के लिए बाइट्स की एक सरणी ले रहा है। सी मानक वास्तव में एक स्ट्रिंग (सी में तकनीकी रूप से ऐसी कोई चीज़ नहीं) और वर्णों (या बाइट्स) की एक सरणी के बीच अंतर नहीं करता है, इसलिए यह आपको इससे दूर जाने देता है। क्या दौरान हो रहा है समय संकलन है कि उन पंक्तियों के कुछ इस तरह करने के लिए परिवर्तित किया जा रहा है है:

fout.write({255, 254, 0}, 2); // "\xff\xfe" 
fout.write({13, 10, 0, 0}, 2); // "\n\0" 
fout.close(); 
+0

'\ x0A' (लाइन फीड कैरेक्टर) गुजरने से काम करेगा? मुझे लगता है कि केवल '\ n' का विशेष अर्थ है, लेकिन मुझे यकीन नहीं है। – SirGuy

+0

संभवतः?यदि आप यूटीएफ -16 फाइलें लिखना चाहते हैं, तो आपको वास्तव में सही लाइब्रेरी फ़ंक्शंस (आमतौर पर डब्ल्यूसी फ़ंक्शंस) का उपयोग करना चाहिए और कोशिश नहीं करना चाहिए और यूटीएफ कोड को हाथ से नहीं करना चाहिए। मानक इतना जटिल है कि आप इसे सही करने के लिए नहीं जा रहे हैं। –

+1

सीआर + एलएफ के लिए नया लाइन अनुवाद रनटाइम में होता है, संकलक नहीं। और यह केवल टेक्स्ट मोड में ऐसा करना चाहिए, बाइनरी नहीं। 'Fout.write (" \ x0a ", 1) का उपयोग करना एक ही प्रभाव है। – Jason

1

आप उत्पादन होने के लिए 4 बाइट भेज दिया। आउटपुट में 5 मनाए गए थे।

आप किसी भी तरह बाइनरी मोड का उपयोग नहीं कर रहे थे। इसका कोई अन्य तरीका नहीं है जिसका आप उपयोग कर सकते हैं .write (buf, 2) और .write (buf, 2) और आउटपुट के 5 बाइट प्राप्त करें।

संभावित रूप से, चीजों के साथ गड़बड़/बजाने में, (जैसे लोग हमेशा अजीब व्यवहार का पता लगाने की कोशिश करते समय करते हैं) कुछ बदलते हैं, यह वास्तव में बाइनरी मोड का दावा करता है।

यदि आप पहले या तो STDOUT या STDERR को आउटपुट करने का प्रयास कर रहे थे, तो यह पूरी तरह से संभव है कि विंडोज स्वचालित रूप से स्ट्रीम में '\ r' जोड़ रहा था क्योंकि STDOUT और STDERR लगभग हमेशा टेक्स्ट होते हैं, और यह आपके प्रयास को ओवरराइड कर सकता था इसे बाइनरी मोड में डालने के लिए। (नहीं, वास्तव में नहीं। नहीं, आप विजुअल स्टूडियो का उपयोग कर रहे हैं, यह वास्तव में है। हाँ, अगर आप साइगविन का उपयोग करते हैं तो यह सच नहीं है, लेकिन आप वीएस का उपयोग कर रहे हैं।)

संबंधित मुद्दे