यह बहुत आम होना चाहिए, लेकिन मुझे यह आकर्षक लगता है कि मुझे कोई सीधा आगे समाधान नहीं मिला।सी ++ एसएलएल स्ट्रिंगस्ट्रीम प्रत्यक्ष बफर एक्सेस
मूल रूप से मैंने नेटवर्क पर एक स्ट्रिंगस्ट्रीम में एक फ़ाइल में पढ़ा।
std::stringstream membuf(std::ios::in | std::ios::out | std::ios::binary);
अब मैं कुछ सी पुस्तकालय है कि स्मृति के पढ़ने हिस्सा तक सीधी पहुंच चाहता है: यह घोषणा है। मैं इसे कैसे प्राप्त करूं? केवल पढ़ने के लिए ठीक है पढ़ें। सी समारोह पूरा होने के बाद, मैं मेमोरीस्ट्रीम का निपटान करता हूं, इसके लिए कोई आवश्यकता नहीं है।
str()
बफर की प्रतिलिपि बनाता है, जो अनावश्यक लगता है और स्मृति को दोगुना करता है।
क्या मुझे कुछ याद आ रही है? शायद एक अलग एसटीएल वर्ग बेहतर काम करेगा।
संपादित करें: जाहिर है, स्ट्रिंगस्ट्रीम को लगातार संग्रहित करने की गारंटी नहीं है। क्या है?
यदि मैं vector<char>
का उपयोग करता हूं तो मैं बाइट बफर कैसे प्राप्त करूं?
चूंकि 'वेक्टर' अपने सभी तत्वों को संगत रूप से संग्रहीत करता है, इसलिए आप "बफर" प्राप्त कर सकते हैं: 'char * buffer = & vector_char.front();' –
@ स्टेव गुइडी: जब तक आप नहीं जानते कि कितने बाइट जा रहे हैं नेटवर्क से बाहर आते हैं, एक 'वेक्टर' 'std: stringstream' से अधिक प्रतियां बना सकता है क्योंकि यह स्टोरेज को संगत रखने के लिए इसके डेटा को पुन: आवंटित करने और कॉपी करने के लिए _has_ को कॉपी करता है। –
क्या यह मदद करता है: http://stackoverflow.com/questions/132358/how-to-read-file-content-into-istringstream/138645#138645 –