2011-09-20 11 views
5

का उपयोग करने के लिए फ़ाइल स्ट्रीम फ़ंक्शन को कनवर्ट करना मेरे पास फ़ाइल स्ट्रीम से डेटा पढ़ने वाले सी ++ वर्गों का भार है। कार्य इस तरह दिखते हैं।सी ++ एक स्ट्रिंगस्ट्रीम

bool LoadFromFile(class ifstream &file); 

मैं फ़ाइल के बजाय स्मृति से पढ़ने के लिए एक नया फ़ंक्शन बना रहा हूं। तो मैं चारों ओर गुग हो गया और एक istringstream कोड में किसी भी संशोधन के बिना चाल करने लगता है।

bool LoadFromData(class istringstream &file); 

अब मेरा प्रश्न है। मुझे एक सार सरणी से पढ़ने के लिए इस स्ट्रीम को बनाने की आवश्यकता है। स्ट्रिंग को निरस्त नहीं किया गया है, यह शुद्ध बाइनरी डेटा है और मुझे आकार के साथ पूर्णांक मिला है। मैंने इसे एक स्ट्रिंग को असाइन करने और स्ट्रिंग से स्ट्रीम बनाने का प्रयास किया, हालांकि स्ट्रिंग एक शून्य चरित्र के बाद समाप्त हो जाती है .. और डेटा की प्रतिलिपि बनाई गई है।

int size; 
char *data; 
string s = *data; 

मैं डेटा सूचक डेटा के आकार को निर्दिष्ट + कॉपी किए बिना ही एक चार सरणी सूचक से एक स्ट्रिंग बना सकता हूँ? क्या आप स्ट्रिंगस्ट्रीम की तुलना में कोई अन्य समाधान जानते हैं?

+1

तो, स्पष्टीकरण: अपनी समस्या यह है कि अपने 'चार *' अशक्त समाप्त नहीं कर रहा है है और इसलिए आप मुसीबत इसे से बाहर एक 'std :: स्ट्रिंग' निर्माण हो रही हो? – quasiverse

+0

हाँ यह मूल रूप से समस्या है। मैं यह भी सोच रहा हूं कि कोई बेहतर समाधान जानता है या नहीं। – Tito

+0

यहां शायद समाधान हो सकता है: http://stackoverflow.com/questions/2079912/simpler-way-to-create-ac-memorystream-from-char-size-t-without-copying-th (एक संस्करण बूस्ट का उपयोग करता है, डेटा की प्रतिलिपि बनाने पर और एक केवल जीसीसी के साथ काम करता है) –

उत्तर

4

अपना खुद का basic_streambuf कक्षा लिखें! More details.। (इस तरह आप वर्तमान मेमोरी पर काम कर सकते हैं।)

पॉइंटर और आकार से स्ट्रिंग बनाने के लिए: string str(data,data+size); (यह डेटा कॉपी करेगा)।

और बात पर: यदि आप अपने कार्यों को फिर से लिखने चाहिए istream के आधार पर करने के लिए:

bool LoadFromStream(istream &is); 

इस तरह से अपने अनुयायीयों को कर सकता है, क्योंकि दोनों istringstream और ifstream पर istream आधारित (बाद में इस समारोह भी टीसीपी का समर्थन करता है हो सकता है धाराओं ...):

ifstream file; 
istringstream sstream; 

LoadFromStream(file); 
LoadFromStream(sstream); 
+0

बहुत बहुत धन्यवाद! इसने कार्यों को बदलने के बिना मेरी समस्या हल की! – Tito

+0

ऐसा लगता है कि यह फ़ाइल स्ट्रीम के लिए काम करता था लेकिन जब मैंने इसे स्ट्रिंग स्ट्रीम पास किया तो मुझे यह कंपाइलर त्रुटि मिली (उपरोक्त सटीक कोड के साथ)। मैंने इसे शोध करने के लिए अपनी पूरी कोशिश की लेकिन मुझे बस यह नहीं मिला। यह वीएस में संकलित है। 'कक्षा std :: basic_istringstream , कक्षा std :: allocator >' to 'class istream और' – Tito

+0

'से पैरामीटर 1 को परिवर्तित नहीं कर सकता है, मैं इसे कई स्थानों पर उपयोग करता हूं। आपको 'बूल लोडफ्रॉस्टस्ट्रीम (आईट्रीम &is);' के रूप में परिभाषित करना चाहिए 'बूल लोडफ्रॉमस्ट्रीम (कक्षा istream &is);' हेडर फ़ाइल में मैं आमतौर पर 'नेमस्पेस std का उपयोग करके' उपयोग नहीं करता हूं, इसलिए परिभाषा है: 'बूल लोडफ्रॉमस्ट्रीम (std :: istream &is);'। '' शामिल होना चाहिए। – Naszta