2010-06-06 19 views
10

हैलो!सी ++ - अपनी स्ट्रीम को लागू करना

मैं कुछ डेटा जो वास्तव में एक सरणी है और मैं भी कुछ विरासत कोड (समारोह) है कुछ size

साथ char* data के रूप में प्रतिनिधित्व किया जा सकता है कि कुछ समय लगता है: मेरी समस्या नीचे दिए तरीक़े वर्णित किया जा सकता अमूर्त std::istream ऑब्जेक्ट एक पैरा के रूप में है और ऑपरेट करने के लिए डेटा पुनर्प्राप्त करने के लिए उस स्ट्रीम का उपयोग करता है।

तो, मेरा प्रश्न निम्न है - data को std::istream ऑब्जेक्ट पर मैप करने का आसान तरीका क्या होगा ताकि मैं इसे अपने कार्य में पास कर सकूं? मैंने अपने data से std::stringstream ऑब्जेक्ट बनाने के बारे में सोचा, लेकिन इसका मतलब है प्रतिलिपि बनाना और (जैसा कि मुझे लगता है) सबसे अच्छा समाधान नहीं है।

कोई विचार यह कैसे किया जा सकता है ताकि मेरा std::istreamdata पर सीधे चल रहा है?

धन्यवाद।

उत्तर

10

यदि आप वास्तव में अपनी स्ट्रीम बना रहे हैं, तो मैं Boost.Iostreams लाइब्रेरी को देखता हूं। यह आपकी खुद की स्ट्रीम ऑब्जेक्ट्स बनाना आसान बनाता है।

+0

और, IIRC, पहले से ही एक std :: वेक्टर या एक सरणी के बाहर सामान खींचने के लिए गोंद है। – Thanatos

2

उपयोग स्ट्रिंग धारा:

#include <sstream> 

int main() 
{ 
    char[] data = "PLOP PLOP PLOP"; 
    int  size = 13; // PS I know this is not the same as strlen(data); 

    std::stringstream stream(std::string(data, size)); 

    // use stream as an istream; 
} 

आप वास्तविक कुशल आप सीधे धारा बफर के साथ गोबर कर सकते हैं होना चाहते हैं। मैं इस की कोशिश की है नहीं और साथ परीक्षण करने के लिए एक संकलक की जरूरत नहीं है, लेकिन folowing काम करना चाहिए:

#include <sstream> 

int main() 
{ 
    char[] data = "PLOP PLOP PLOP"; 
    int  size = 13; // PS I know this is not the same as strlen(data); 

    std::stringstream stream; 
    stream.rdbuf()->pubsetbuf(data, size); 

    // use stream as an istream; 
} 
5

निश्चित रूप से नहीं सबसे आसान तरीका है लेकिन सिर्फ मामले में किसी को समझने के लिए एसटीडी धाराओं के अंदर काम करना चाहता था, इस लिए लगता है आप अपने खुद के कैसे रोल कर सकते हैं के बारे में एक बहुत अच्छा परिचय हो:

http://www.mr-edd.co.uk/blog/beginners_guide_streambuf

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