2012-03-13 14 views
6

मैं std::copy का उपयोग कर रहा हूं ताकि वस्तुओं को std::deque में किसी फ़ाइल में कॉपी किया जा सके। कोड ठीक काम कर रहा है लेकिन मुझे यह जांचने की ज़रूरत है कि प्रतिलिपि सफल रही है और तदनुसार मुझे ध्वज सेट करने की आवश्यकता है या फिर अपवाद फेंकना है।सफलता या विफलता के मामले में std :: copy का मूल्य कैसे वापस करें?

मैंने गुगल किया है लेकिन समाधान नहीं मिला कि std::copy ने सफलतापूर्वक फ़ाइल में मूल्यों की प्रतिलिपि बनाई है या नहीं।

क्या कोई इस पर प्रकाश डाल सकता है।

+3

तुम सिर्फ जाँच नहीं कर सकते [धारा आई/ओ राज्य] (http://en.cppreference.com/w/cpp/io/ios_base/iostate): यह लिखने के लिए और अधिक सही होगा? –

उत्तर

5

यदि फ़ाइल में लिखना विफल रहता है, तो फ़ाइल स्ट्रीम की त्रुटि झंडे सेट की जाएंगी - आप या तो प्रतिलिपि के बाद इन्हें जांच सकते हैं, या exceptions सदस्य फ़ंक्शन को पहले त्रुटि पर अपवाद फेंकने के लिए कॉल कर सकते हैं। अगर कुछ और विफल रहता है, तो एक अपवाद फेंक दिया जाएगा।

2

AFAIK std :: कॉपी एल्गोरिदम कुछ भी जांच नहीं करता है और केवल सभी तत्वों पर पुनरावृत्त करता है और उन्हें आउटपुटर आउटपुट करने की प्रतिलिपि बनाता है। इसका मतलब यह है कि आपको आउटपुट इटरेटर में खुद को एनोट स्पेस प्रदान करना चाहिए अन्यथा व्यवहार अनिर्दिष्ट है।

तो आपके मामले में आपको खुद को जांचना चाहिए कि आउटपुट फ़ाइल लिखने योग्य है, आदि .. यह जांचने के संभावित तरीकों में से एक मुझे लगता है कि आप जिस फ़ाइल स्ट्रीम का उपयोग कर रहे हैं, उसके लिए त्रुटि झंडे का उपयोग करें, यानी यह जांचने के बाद कि आपका ofstreamgood है (आप good(), eof(), fail() और bad() इस के लिए फ़ंक्शन का उपयोग कर सकते हैं)।

दूसरा दृष्टिकोण std::copy के वापसी मूल्य की जांच करना है। चूंकि यह गंतव्य सीमा के अंत में एक पुनरावर्तक देता है (जो अंतिम की प्रति के बाद तत्व को इंगित करता है) तो आप std::copy और आपके आउटपुट इटरेटर के रिटर्न वैल्यू के बीच अंतर की गणना कर सकते हैं और यह सुनिश्चित कर सकते हैं कि यह आकार के बराबर है आपका deque। जैसे (स्यूडोकोड)

OutputIterator result = std::copy(input.begin(), input.end(), output); 
assert(result - output == input.end() - input.begin()); 

संपादित करें: दूसरा दृष्टिकोण से काम करता है केवल जब output भी इनपुट इटरेटर प्रकार है तो std::distance इसके लिए काम किया।

assert(std::distance(output, result) == std::distance(input.begin(), input.end())); 
+0

बेशक आप 'std :: ostream_iterator' के साथ दूसरा दृष्टिकोण नहीं कर सकते हैं, क्योंकि यह आउटपुट इटरेटर है,' std :: distance' या तो काम नहीं करेगा। –

+0

हाँ आप सही हैं। दूसरा दृष्टिकोण केवल तभी काम करेगा जब 'आउटपुट' इनपुट इटरेटर भी होगा। –

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