2010-01-26 16 views
13

मेरे पास निम्न कोड है और यह बहुत अच्छा काम करता है (इस तथ्य के अलावा कि यह बहुत धीमा है, लेकिन मुझे इसके बारे में ज्यादा परवाह नहीं है)। यह अंतर्ज्ञानी प्रतीत नहीं होता है कि यह इन्फाइल की संपूर्ण सामग्री को बहिर्वाह में लिख देगा।ifstream :: rdbuf() वास्तव में क्या करता है?

// Returns 1 if failed and 0 if successful 
int WriteFileContentsToNewFile(string inFilename, string outFilename) 
{ 
    ifstream infile(inFilename.c_str(), ios::binary); 
    ofstream outfile(outFilename.c_str(), ios::binary); 

    if(infile.is_open() && outfile.is_open() && infile.good() && outfile.good()) 
    { 
     outfile << infile.rdbuf(); 

     outfile.close(); 
     infile.close(); 
    } 
    else 
     return 1; 

    return 0; 
} 

कोई अंतर्दृष्टि?

+1

मैं उस स्पष्ट कॉल को 'बंद()' की आवश्यकता नहीं जोड़ूंगा। वैसे भी विनाशक वही करेंगे। और वह कुछ लाइनों को बचाता है। ;) –

उत्तर

12

हां, यह मानक में निर्दिष्ट है और यह वास्तव में काफी सरल है। rdbuf() दिए गए [io]stream ऑब्जेक्ट के लिए अंतर्निहित basic_streambuf ऑब्जेक्ट पर केवल एक पॉइंटर लौटाता है।

basic_ostream<...>basic_streambuf<...> के लिए सूचक जो बाहर basic_streambuf<...> की सामग्री लिखता है के लिए operator<< के लिए एक अधिभार नहीं है।

+2

लेकिन ऑपरेटर नहीं होगा << बस एक हिस्सा लिखें? यह देखना आसान नहीं है कि यह पूरी चीज को एक खंड के रूप में लिख देगा। मैं समझता हूं कि यह एक सूचक है लेकिन क्या उस सूचक में पूरे डेटा को एक खंड के रूप में शामिल किया जाता है? मैं अभी भी थोड़ा उलझन में हूँ। –

+3

मुझे यकीन नहीं है कि आप 'एक खंड' के साथ क्या चल रहे हैं? यह बफर के अंत तक पहुंचने तक त्रुटि द्वारा 'streambuf' वर्ण की ओर इशारा की सामग्री को आउटपुट करने के लिए निर्दिष्ट किया गया है या इसे आउटपुट करने में त्रुटि हुई है। 'स्ट्रीमबफ' एक क्लास इंस्टेंस है और क्या यह इसके नियंत्रित अनुक्रम को संगत मेमोरी में संग्रहीत करता है या नहीं निर्दिष्ट किया गया है और इंटरफ़ेस से अनुमानित नहीं किया जा सकता है। –

+0

ठीक है, यह तब तक चरित्र द्वारा वर्णित करता है जब तक बफर के अंत तक नहीं पहुंच जाता है। तुम्हें कैसे पता? मैंने इंटरफेस से यह नहीं देखा। –

15

iostream कक्षाएं I/O बफर के आसपास बस रैपर हैं। iostream स्वयं पूरी तरह से नहीं करता है ... मुख्य रूप से, यह operator>> प्रारूपण ऑपरेटरों प्रदान करता है। बफर basic_streambuf से प्राप्त ऑब्जेक्ट द्वारा प्रदान किया जाता है, जिसे आप rdbuf() का उपयोग करके प्राप्त और सेट कर सकते हैं।

basic_streambuf आभासी कार्य करता है जो पढ़ने/फ़ाइलें, तार, लिखने के लिए एक समान अंतरफलक प्रदान करने के लिए ओवरराइड कर रहे हैं की संख्या के साथ एक सार आधार है आदि समारोह basic_ostream<…>::operator<<(basic_streambuf<…>) जब तक अंतर्निहित डेटा स्रोत है बफर के माध्यम से पढ़ने रखने के लिए परिभाषित किया गया है थक।

iostream हालांकि, एक भयानक गड़बड़ है।

+0

मैं सहमत हूं, और यह एक अच्छा जवाब है लेकिन चार्ल्स ने अपना जवाब पहले प्रस्तुत किया ताकि वह विजेता हो। मैंने आपका जवाब फिर से वोट दिया! –

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