2013-06-11 11 views
7

मुझे मिल गया है, शायद मामूली सवाल है लेकिन मैं इसे समझ नहीं पा रहा हूं। ताजा VS8 सी ++ एक्सप्रेस परियोजना मेंवीएस 8 file.close() को संभाल नहीं सकता है; file.open() ;, क्यों?

fstream file; 
file.open("data", ios::in); 
if(!file.good()){ 
    file.close(); 
    file.open("data", ios::out); 
    if(!file.good()) cout<<"not good"<<endl; 
    file<<"test"<<endl; 
    file.close(); 
} 

: मैं सरल कोड लिखा है। जब मैं इसे चलाता हूं और "डेटा" मौजूद नहीं होता है, तो यह फ़ाइल बनाता है, लेकिन "अच्छा नहीं" (दूसरा) भी देता है ताकि आउटपुट फ़ाइल में नहीं लिखा जा सके। और अब मजाकिया बात आती है। अगर मैं वीएस 10 सी ++ एक्सप्रेस और कोड :: ब्लॉक 12 में एक ही कोड संकलित करता हूं, तो यह ठीक काम करता है।

ऐसा क्यों है?

@edit मेरे दोस्त ने इसे अपने पीसी पर वीएस 8 सी ++ एक्सप्रेस के साथ भी चेक किया। उसके लिए भी काम करता है।

@ EDIT2 "समाधान" के साथ मेरी टिप्पणी के रूप में ही है:

.clear साथ failbit स्पष्ट करने के लिए मजबूर(); विधि काम करने लगती है। जब आप नए आईडीई में सीखते हैं तो उसे दर्द होता है और फिर उसे पुराने पर स्विच करना पड़ता है: /। Tho, यह अच्छा सबक देता है। धन्यवाद दोस्तों।

+2

विभिन्न कंपाइलरों के पास कभी-कभी मानक के विभिन्न कार्यान्वयन होते हैं। विशेष रूप से माइक्रोसॉफ्ट कंपाइलर्स ... – Appleshell

+0

आप 'good' के बजाय' is_open' का उपयोग कर सकते हैं। –

+1

शायद पहली विफलता के बाद विफलता को साफ़ नहीं किया जा रहा है। ऐसा लगता है कि "ओपन" अब सी ++ 11 में सफलता पर असफलता को साफ़ करता है और शायद यह परिवर्तन कुछ नई मानक सुविधाओं की प्रत्याशा में वीएस -2010 में बनाया गया था (उन टैब पर क्लिक करें जो सी ++ 03 और सी + के बीच अंतर दिखाते हैं। +11 http://www.cplusplus.com/reference/fstream/fstream/open/) – statueuphemism

उत्तर

4

यह डिज़ाइन द्वारा किया गया था। सी ++ 98 में, एक fstream बंद करने से त्रुटि स्थिति साफ़ नहीं होती है और fstream पर open() पर कॉल करने से त्रुटि स्थिति रीसेट नहीं होती है। इस मुद्दे की चर्चा के लिए LWG Defect #409 देखें।

व्यवहार C++ 11 में बदल दिया गया था, जैसे कि खुली ऑपरेशन सफल होने पर त्रुटि स्थिति साफ़ हो जाती है (clear() पर कॉल के माध्यम से)।

+0

क्या माइक्रोसॉफ्ट इस जानकारी को अपने डेवलपर्स के माध्यम से अलग करता है जो स्टैक ओवरफ्लो प्रश्नों को समझने के लिए होता है? मैंने इस जानकारी को fstream के व्यवहार के बारे में संक्षिप्त रूप से खोजने की कोशिश की :: VS2010 के सापेक्ष वीएस -2010 में खुला, लेकिन जल्दी से कुछ भी सार्थक नहीं मिल सका। – statueuphemism

+0

@statueuphemism: एमएसडीएन पर प्रलेखन कार्यान्वयन के लिए आधिकारिक दस्तावेज है। [Cppreference.com] (http://en.cppreference.com/w/) वेबसाइट भी बहुत अच्छी है (सी ++ मानक लाइब्रेरी के लिए, यह निर्दिष्ट पुस्तकालयों को लागू करने का हमारा इरादा है; हम अनुरूपता को बहुत गंभीरता से लेते हैं)। –

+0

यहां वीएस -2010 में एफस्ट्रीम ओपन के लिए एमएसडीएन आलेख है (मूलभूत_फस्ट्रीम :: ओपन पर वापस पता लगाया गया है) जो सी ++ 0x का अनुपालन करने के लिए आपके द्वारा वर्णित व्यवहार के बारे में कोई उल्लेख नहीं करता है (सी ++ 11 के केवल ड्राफ्ट उपलब्ध थे वीएस -2010 की रिलीज): http://msdn.microsoft.com/en-us/library/4dx08bh4(v=vs.100).aspx एक डेवलपर जो विजुअल स्टूडियो के बाद के संस्करण में संभावित रूप से माइग्रेट करने की तलाश में है, नोट्स को रिलीज़ करें दस्तावेज इन परिवर्तनों को अनियंत्रित व्यवहार में परिवर्तन के कारण सूक्ष्म बग को रोकने में बहुत मददगार होगा। मैंने http://msdn.microsoft.com/en-us/library/dd465215(v=vs.100).aspx भी ब्राउज़ किया – statueuphemism

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