7

मुझे लगता है कि मैं इस पर सही हो और कोड के साथ शुरू करेंगे:कैसे एक fstream (C++ 0x) वापस जाने के लिए

#include <iostream> 
#include <fstream> 
#include <string> 

class test : public std::ofstream 
{ 
    public: 
     test(const std::string& filename) { this->open(gen_filename(filename)); }; 
     test(const test&) = delete; 
     //test(test&& old) = default; // Didn't compile 
     test(test&& old) {}; 
    private: 
     std::string gen_filename(const std::string& filename) 
     { return filename + ".tmp"; } 
}; 

int main() 
{ 
    auto os = test("testfile"); 
    os << "Test1\n"; 
    os << "Test2\n"; 
} 

मूल रूप से, मैं एक ofstream लौटना ही होगा। बेशक आप एक ऑफस्ट्रीम की प्रतिलिपि नहीं बना सकते हैं, इसलिए मैंने क्लास टेस्ट में कोड के साथ चारों ओर झुकाया, और मैंने उपरोक्त को संकलित और काम करने के लिए मिल गया जैसा आप उम्मीद करेंगे (जीसीसी 4.5 पर)।

लेकिन मुझे बुरा लगता है कि यह मेरे कंपाइलर के कारण "ऑटो ओएस = टेस्ट()" पर "रिटर्न वैल्यू ऑप्टिमाइज़ेशन" (आरटीओ) कर रहा है। दरअसल, यदि निम्न में संशोधित करें:

int main() 
{ 
    auto os = test("testfile"); 
    os << "Test1\n"; 
    auto os2 = std::move(os); 
    os2 << "Test2\n"; 
} 

अब मुझे आउटपुट में टेस्ट 1 और टेस्ट 2 दोनों नहीं मिलते हैं।

बात यह है कि कक्षा "परीक्षण" कॉपी करने योग्य नहीं है, इसलिए ऑफस्ट्रीम को डुप्लिकेट करने का कोई मौका नहीं है। मैं बस इसे एक समारोह से वापस करने में सक्षम होना चाहता हूँ। और मैं जीसीसी के साथ ऐसा करने में सक्षम हूं।

मुझे बदले में एक ढेर के लिए स्मार्ट पॉइंटर्स को हटाना नहीं होगा, या फ़ाइल को फिर से खोलना होगा, क्योंकि यह वर्तमान में उन चीजों को किए बिना काम करता है। मुझे बस एक एहसास है कि मैं अपने दृष्टिकोण में थोड़ा "गैर-मानक" हूं, इसलिए मैंने जो वर्णन किया है उसका एक मानक तरीका बहुत अच्छा होगा।

उत्तर

15

मैं यहाँ अपने खुद के सवाल का जवाब देने जा रहा हूँ:

GCC C++0x Library Features पृष्ठ में, आइटम 27.9 पर एक नज़र है, जो पढ़ता है: - फ़ाइल आधारित धाराओं - आंशिक -

27,9 लापता चालें और स्वैप ऑपरेशंस

मुझे लगता है कि शायद यह समस्या मैं जीसीसी के साथ कर रहा हूं।

+0

हाँ, वह ऐसा करेगा। अच्छा खोज, यद्यपि। – GManNickG

+0

अभी भी सच है? –

+0

ऐसा नहीं लगता है। यदि आप कर सकते हैं तो प्रश्न और उत्तर को संपादित करने के लिए स्वतंत्र महसूस करें। – Clinton

2
समस्या

इस के साथ है:

test(test&& old) {}; 

यह आपको एक rvalue test से एक नया test बना सकते हैं हाँ, लेकिन यह (कोई फ़ाइल खोलें) अपने आधार, जो केवल डिफ़ॉल्ट निर्माण किया जा रहा है के बारे में कुछ भी नहीं कहना है ।

test(test&& old) : std::ofstream(std::move(old)) {}; 

कौन सा आधार में old से धारा पर आ जाएगा: क्या आप चाहते हैं यह है।

+0

आपका उत्तर gcc 4.5 पर निम्न संकलन त्रुटि देता है: "'std :: ios_base :: ios_base (const std :: ios_base &)' निजी है"। क्या आप वाकई इसे संकलित करने के लिए मिला है, और यदि ऐसा है, तो किस कंपाइलर पर? – Clinton

+0

@ क्लिंटन: मैंने आपके कोड को संकलित करने की कोशिश नहीं की है, हालांकि मैंने इसे कई बार पहले किया है। (ध्यान दें "यह संकलित करता है" यह सही सी ++ होने के लिए आवश्यक नहीं है)। आप जिस नए कोड को आजमा रहे हैं और सभी त्रुटियों को शामिल करने के लिए आपको अपना प्रश्न संपादित करना चाहिए। – GManNickG

+0

क्या आप निश्चित हैं कि स्ट्रीमस्ट्रीम में एक रैल्यू कन्स्ट्रक्टर है? – Clinton

0

क्या कॉलर को यह जानने की आवश्यकता है कि आप ofstream लौट रहे हैं, या streambuf वापस करने के लिए और अधिक समझदारी होगी, और कॉलर को इसे स्ट्रीम के अंदर लपेटने दें?

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