2012-09-18 18 views
6

निम्नलिखित कोड दोनों अनाम और नामित धाराओं के साथ एक फ़ाइल के लिए एक स्ट्रिंग शाब्दिक आउटपुट:बेनामी std :: ofstream संभालती चरित्र सरणी को गलत तरीके से

#include <fstream> 

using namespace std; 

int main() 
{ 
    ofstream("testfile") << "test" << endl; 

    ofstream ofs ("testfile2"); 
    ofs << "test2" << endl; 

    return 0; 
} 

आप strace के उत्पादन से देख सकते हैं, तो केवल नामित धारा काम करता है:

open("testfile", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3 
write(3, "0x400a91\n", 9)    = 9 
close(3)        = 0 
open("testfile2", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3 
write(3, "test2\n", 6)     = 6 
close(3)        = 0 

इसके अलावा, यदि आप एक शाब्दिक के बजाय std :: string का उपयोग करते हैं, तो यह संकलित करने में विफल रहता है।

यह क्यों है?

उत्तर

4

सी ++ 03 में, गैर-सदस्य ऑपरेटर जो आउटपुट कैरेक्टर पॉइंटर्स और तारों को आउटपुट के साथ नहीं कहा जा सकता है, क्योंकि उन्हें एक लवल्यू संदर्भ की आवश्यकता होती है, इसलिए सदस्य operator<<(const void *) कहा जाता है। सी ++ 11 में यह ओवरलोड लोड करके हल किया जाता है जो एक रावल्यू संदर्भ लेता है, लेकिन सी ++ 03 में आप सदस्य फ़ंक्शन या सदस्य ऑपरेटर को कॉल करके इसके आसपास काम कर सकते हैं जो एक लवल्यू संदर्भ देता है (ध्यान दें कि गैर-कॉन्स सदस्य फ़ंक्शन rvalues ​​पर कहा जा सकता है):

std::ios_base& (*do_nothing)(std::ios_base&)) {} 

ofstream("testfile") << do_nothing << "test" << endl; 
+0

इस उत्तर को स्वीकार करते हुए क्योंकि कामकाज सी ++ 03 पर काम करता है। धन्यवाद! –

9

आपको एक समस्या है कि "अज्ञात स्ट्रीम" एक रैल्यू है, और सी ++ 98 के साथ आप केवल सदस्य कार्यों को कॉल कर सकते हैं। stream << "test" एक सदस्य से जुड़ जाएगा जो void* लेता है जो सूचक के पते को आउटपुट करता है।

सी ++ 11 ने operator<< जोड़ा है जो एक राल्लू स्ट्रीम लेता है, और यह कोड को काम करेगा।

+0

ओह गेंदों, मैं गैर memberness बारे में भूल गया:

ofstream("testfile").write("", 0) << "test" << endl; 

आप आसानी से ऐसा करने के लिए जोड़तोड़ लिख सकते हैं। तुम जीते। – Puppy

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