2010-03-11 21 views
5

मेरे पास C++ में कोड का निम्न भाग है।एक बाइनरी फ़ाइल नहीं लिख सकता

int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 
ofstream output("Sample.txt", ios::out | ios::binary); 

for(int i = 0; i < 10; i++) 
{ 
    output<<arr[i]; 
} 

अब Sample.txt इस तरह है:

12345678910 

नहीं है "Sample.txt" बाइनरी में होना चाहिए? बाइनरी मोड में स्ट्रीम खोलने पर यह सब कुछ बाइनरी में क्यों नहीं बदलता है। मुझे क्या करना चाहिए, मुझे सरणी में प्रत्येक तत्व की बाइनरी की आवश्यकता है और फिर इसे फ़ाइल में प्रिंट करें।

+0

"बाइनरी" में आपका क्या मतलब है? – GManNickG

+0

सरणी में संबंधित पूर्णांक के लिए बाइनरी मान, इसलिए अगर सरणी में पूर्णांक 5 है, तो उसे 5 – Jay

+0

के बजाय 101 प्रिंट करना चाहिए, ठीक है, आपको कच्चे डेटा को आउटपुट करने के लिए 'लिखें' फ़ंक्शन का उपयोग करना होगा। लेकिन इसके साथ, यह डिस्क पर प्रिंट 101 (अच्छी तरह से, शायद 0000000000000101 की तरह) करता है, लेकिन जो भी आप फ़ाइल देखने के लिए उपयोग कर रहे हैं वह वास्तव में कच्चे और शून्य को प्रदर्शित नहीं करेगा। टेक्स्ट-फ़ाइल दर्शक इसे डीकोड करने का प्रयास करेंगे (उदाहरण के लिए, ASCII के साथ), यही कारण है कि जब आप एक टेक्स्ट एडिटर में बाइनरी फाइलें खोलते हैं तो आपको गलेदार बकवास दिखाई देता है। आप 1 और 0 के कभी नहीं देखते हैं। शायद एक हेक्स-संपादक, जो ऐसा करता है, अधिक उपयुक्त होगा। – GManNickG

उत्तर

3

"नमूना.txt" बाइनरी में नहीं होना चाहिए?

नहीं। क्या std::ios::binary करता प्लेटफ़ॉर्म-विशिष्ट EOL से/'\n' का अनुवाद जैसी चीजों को रोकने के लिए है। यह डेटा बाइट्स और उनके स्ट्रिंग अनुवाद के आंतरिक प्रतिनिधित्व के बीच अनुवाद को नहीं छोड़ेगा। आखिरकार, यही सब कुछ है। (साथ ही, इस बारे में सोचें कि आप उपयोगकर्ता द्वारा परिभाषित प्रकार के ऑब्जेक्ट को बाइनरी प्रस्तुति में पॉइंटर्स कैसे स्ट्रीम करेंगे।)

वास्तव में ऑब्जेक्ट्स बाइनरी उपयोग std::ostream::write() लिखने के लिए। सावधान रहें, हालांकि, परिणाम मंच-विशिष्ट है।

+0

तो मैं सरणी को फ़ाइल में बाइनरी मान के रूप में कैसे लिखूं? – Jay

+0

output.write ((char *) arr, sizeof (arr)); –

+0

यदि मैं कहता हूं, output.write ((char *) arr [i], sizeof (int)); प्रोग्राम क्रैश हो गया और output.write ((char *) arr, sizeof (arr)) Sample.txt फ़ाइल – Jay

0

द्विआधारी मोड ज्यादातर मतलब यह है कि (उदाहरण के लिए) वहाँ एक नया ऑनलाइन चरित्र है कि आप प्रोग्राम लिखते हैं, और जो कुछ भी अपने मंच के निशान को पंक्ति के अंत (उदाहरण के लिए "\ r \ n" सोचता है कि जो परिवर्तन नहीं होगा विंडोज पर, "\ r" मा पर)।

वास्तव में बाइनरी लिखने के लिए, आप आमतौर पर ofstream.write() का उपयोग करेंगे।

0

बाइनरी का मतलब है कि न्यूलाइन वर्ण ओएस-विशिष्ट प्रारूप में/से परिवर्तित नहीं किए जाते हैं। ofstream के साथ int के मान को आउटपुट करने से इसे दशमलव संख्या (सामान्य ASCII टेक्स्ट) के रूप में प्रारूपित किया जाएगा।

आप द्विआधारी द्वारा क्या मतलब के लिए, आप बल्कि प्रकार char के मूल्यों लिखने या गैर स्वरूपण समारोह output.write (docs here) का उपयोग करना चाहिए।

0

'पाठ नहीं' के रूप में बाइनरी का अर्थ है कि कोई भी प्रारूपण नई लाइनों की तरह नहीं किया जाता है और इसी तरह।

See:

फ़ाइल इनपुट और आउटपुट संचालन किसी भी प्रारूप विचारों की स्वतंत्र रूप से प्रदर्शन द्विआधारी मोड में खोला धाराओं। गैर-बाइनरी फ़ाइलें टेक्स्ट फ़ाइलों के रूप में जानी जाती हैं, और कुछ अनुवाद कुछ विशेष वर्णों (जैसे न्यूलाइन और कैरिज रिटर्न वर्णों) की स्वरूपण के कारण हो सकते हैं।

यह आपके लिए 0 और 1 प्रारूप में अनुवाद नहीं करेगा। पीसी पर सब कुछ binary प्रारूप का उपयोग कर रहा है, लेकिन जब आप फ़ाइल खोलते हैं और इसे संपादक के साथ पढ़ते हैं, तो संपादक बाइनरी डेटा पढ़ता है और आपके लिए ASCII वर्ण प्रदर्शित करता है।

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