2012-10-24 13 views
16

मेरे पास const char* पॉइंटर द्वारा इंगित बफर में कुछ डेटा है। डेटा सिर्फ एक ASCII स्ट्रिंग है। मुझे इसका आकार पता है। मैं स्ट्रीम को पढ़ने के तरीके से इसे पढ़ने में सक्षम होना चाहता हूं।निरंतर मेमोरी से इनपुट स्ट्रीम बनाना

// for example, data points to a string "42 3.14 blah" 
MemoryStreamWrapper in(data, data_size); 
int x; 
float y; 
std::string w; 
in >> x >> y >> w; 

महत्वपूर्ण शर्त: डेटा कॉपी नहीं किया जाना चाहिए या बदल किसी भी तरह से में (अन्यथा मैं सिर्फ एक स्ट्रिंग धारा का उपयोग करेंगे मैं एक समाधान है कि मुझे इस तरह कोड लिखने की अनुमति होगी के लिए देख रहा हूँ मेरे सर्वोत्तम ज्ञान के लिए, डेटा को प्रतिलिपि किए बिना एक कॉन्स्ट चार सूचक से स्ट्रिंग स्ट्रीम बनाना संभव नहीं है।)

+0

pinging @ डिटमार-कुहल ... –

+0

क्या 'डेटा' के प्रकार है? यह 'const char *' सही है? –

+0

हां, यह 'const char *' –

उत्तर

23

ऐसा करने का तरीका उपयुक्त स्ट्रीम बफर बनाना है। यह, उदाहरण के लिए, इस तरह किया जा सकता है: धारा बफर डेटा नहीं बदलेगा लेकिन इंटरफ़ेस अभी भी char* आवश्यकता प्रयोग की जाने वाली, मुख्य रूप से:

#include <streambuf> 
#include <istream> 

struct membuf: std::streambuf { 
    membuf(char const* base, size_t size) { 
     char* p(const_cast<char*>(base)); 
     this->setg(p, p, p + size); 
    } 
}; 
struct imemstream: virtual membuf, std::istream { 
    imemstream(char const* base, size_t size) 
     : membuf(base, size) 
     , std::istream(static_cast<std::streambuf*>(this)) { 
    } 
}; 

केवल कुछ हद तक अजीब बात धारा बफर में const_cast<char*>() है "सामान्य" स्ट्रीम बफर में बफर को बदलने में आसान बनाना। इस के साथ, आप एक सामान्य इनपुट धारा के रूप में imemstream उपयोग कर सकते हैं:

imemstream in(data, size); 
in >> value; 
+0

क्या है यह आपको प्राप्त करता है कि 'istringstream'' pubsetbuf' नहीं है? – ildjarn

+0

क्या आप सिर्फ सामान्य 'std :: istringstream' नहीं बना सकते हैं और '.rdbuf() -> पबेटबफ (डेटा, आकार)' के माध्यम से ऐसा ही कर सकते हैं? – Xeo

+0

हालांकि मैं उससे भी आसान था! मुझे लगता है कि मैंने सोचा था कि यह जटिल होगा क्योंकि मैंने सॉकेट धाराओं के लिए भी ऐसा किया है, इस मामले में इसे सैकड़ों लाइनों की आवश्यकता होती है ... – user1610015

1

एकमात्र तरीका std :: istream subclass करना होगा (जिसे subclassing std :: स्ट्रीमबफ) अपनी खुद की स्ट्रीम क्लास बनाने के लिए जो लगातार स्मृति से पढ़ता है।

यह उतना आसान नहीं है जितना लगता है क्योंकि सी ++ मानक लाइब्रेरी स्ट्रीम कक्षाएं बहुत गन्दा और बुरी तरह से डिज़ाइन की गई हैं। मुझे नहीं लगता कि यह इसके लायक है जब तक कि आपको इसे बहुत अधिक करने की आवश्यकता न हो।