2010-02-09 9 views
5

अगर मैं की तरह एक फ़ाइल को खोला:: आईओएस :: बाइनरी के रूप में खोला गया एक फ़ाइल आईओएस :: बाइनरी के रूप में खोले गए से अलग है। ios :: बाहर?

ofstream file("file.dat",ios::binary); 

या

ofstream file("file.dat",ios::binary | ios::out); 

मैं क्या है कि मैं पूर्व फार्म के साथ ऐसा नहीं कर सकते और इसके विपरीत

उत्तरार्द्ध रूप में खोला गया एक फ़ाइल के साथ कर सकते

आप

उत्तर

1

धन्यवाद अगर कुछ भी निर्दिष्ट नहीं किया गया है, लेकिन यदि आपने केवल ios :: का उपयोग ऑफस्ट्रीम के साथ किया है, तो कोई संकलन त्रुटियां नहीं (जब तक आप पढ़ने() या >> या कुछ ifstream ऑब्जेक्ट का उपयोग नहीं करते) लेकिन कोई भी फाइल नहीं लिखी जाएगी।

ifstream का उपयोग कर: ios :: में डिफ़ॉल्ट भले ही कुछ भी नहीं निर्दिष्ट किया जाता है है, लेकिन अगर आप केवल ios ifstream के साथ बाहर का इस्तेमाल किया ::, कोई संकलन त्रुटियों (जब तक आप लिखने() या < < या कुछ का उपयोग ऑफस्ट्रीम ऑब्जेक्ट) लेकिन आप फ़ाइल से कोई भी जानकारी नहीं पढ़ सकते हैं।

fstream का उपयोग करके: कोई डिफ़ॉल्ट नहीं, आपको स्पष्ट रूप से यह निर्धारित करना होगा कि आप क्या करने जा रहे हैं। अन्यथा, कोई संकलन त्रुटि नहीं है लेकिन आप जो भी चाहते हैं उसे प्राप्त नहीं करते हैं।

मूल प्रश्न के लिए, दोनों बिल्कुल वही काम करते हैं!

5

धन्यवाद एक ofstream के लिए, ios::out डिफ़ॉल्ट है, इसलिए वहाँ कोई अंतर नहीं है। मेरा मानना ​​है कि आईओएस :: आउट निर्दिष्ट करने का एकमात्र समय एक फर्क्रीम का उपयोग करता है, जिसे पढ़ने या लिखने के लिए खोला जा सकता है, या दोनों।

+0

कोई यदि आप एक fstream का उपयोग करते हैं, तो आप न तो आईओएस :: आउट और न ही आईओएस :: लिख सकते हैं और आप अभी भी फ़ाइल से लिखने और पढ़ने में सक्षम होंगे .. तो क्या यह हमेशा एक ही लेखन नहीं है Ios :: लिख नहीं है? –

+0

@Imengineer: मुझे यह सुनिश्चित करने के लिए जांचना होगा, लेकिन अगर मेमोरी डिफ़ॉल्ट रूप से इनपुट और आउटपुट दोनों के लिए खोला जाता है, लेकिन यदि आप आईओएस :: आउट निर्दिष्ट करते हैं, तो यह केवल आउटपुट के लिए खोला जाता है, और यदि आप निर्दिष्ट करते हैं ios :: में, यह केवल इनपुट के लिए खोला गया है। हालांकि यह स्मृति से जा रहा है, यह निश्चित रूप से गारंटी नहीं है। –

2

ज्यादातर मामलों में मुझे उम्मीद नहीं होगी कि इसमें कोई फर्क नहीं पड़ता है, हालांकि ऐसा लगता है कि यह तकनीकी रूप से कार्यान्वयन विशिष्ट हो सकता है।

मेरे कार्यान्वयन में (जीसीसी 3.4.3) ऑफस्ट्रीम के लिए खुला आईओएस ::: मोड को ऑफस्ट्रीम-> ओपन() कॉल में कन्स्ट्रक्टर के माध्यम से निर्दिष्ट किए जाने के बावजूद उपयोग करता है, इसलिए यह पूरी तरह से वैकल्पिक है। अगर fstream का उपयोग करते हैं, तो यह मामला नहीं है और इसे स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता होगी।

2

स्टैंडर्ड की जांच कर रहा, खंड 27.8.1.3 विभिन्न ios संशोधक (जैसे ios::in और ios::out) की चर्चा है, और उन्हें सी fopen() मापदंडों के नक्शे। मानक के मुताबिक, यदि फ़ाइल खोलने पर निर्दिष्ट कोई संशोधक नहीं हैं, तो खुले विफल हो जाते हैं।

27.8.1.9 में, हम पाते हैं कि ofstream इस तरह काम करता है, लेकिन ios::out स्वचालित रूप से निर्दिष्ट है। इसलिए, मूल प्रश्न का उत्तर यह है कि दोनों ठीक वही काम करेंगे।

मुझे नहीं पता कि लोग fstream के साथ ios::in या ios::out के बिना क्यों खुल रहे हैं, लेकिन मानक के मेरे पढ़ने का कहना है कि इसे काम नहीं करना चाहिए। मुझे 27.8.1.3 के अन्य लोगों के रीडिंग में दिलचस्पी होगी। अब मैं परीक्षण किया मैं क्या जवाब दिया गया है के आधार पर कई कोड और इस सार के साथ आया था: ofstream का उपयोग कर

: ios :: बाहर डिफ़ॉल्ट भी है सब लोग हैं, जो मुझे जवाब के लिए

+0

इस मानक को कहां खोजें ?? –

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