2012-02-20 25 views
7

मैं एक फ़ंक्शन का उपयोग करने की कोशिश कर रहा हूं जो किसी तृतीय पक्ष lib में आता है और एक इनपुट स्ट्रीम ऑब्जेक्ट की अपेक्षा करता है जिसमें बाइनरी फ़ाइल डेटा ले जाया जाता है।सुविधाजनक स्ट्रीम std :: vector <unsigned char> इनपुट स्ट्रीम (std :: istream) ऑब्जेक्ट

हस्ताक्षर कि तरह लग रहा है:

doSomething(const std::string& ..., 
      const std::string& ..., 
      std::istream& aData, 
      const std::string& ..., 
      const std::map<std::string, std::string>* ..., 
      long ..., 
      bool ...); 

जब से मैं नहीं बदल सकते हैं/इस 3 पार्टी lib/समारोह बदलने के लिए, मैं "मेरी" कोड में अनुकूल करने के लिए किया है। कॉलिंग जगह में, मेरे पास एक std :: वेक्टर है जिसमें डेटा है जो एक आईट्रीम ऑब्जेक्ट में पारित होने की उम्मीद है। वर्तमान में मैं वेक्टर को धारा में प्रतिलिपि बनाकर, < < ऑपरेटर का उपयोग करके बाइट द्वारा बाइट कॉपी करने के लिए प्रतिलिपि बना रहा हूं।

मुझे दृढ़ता से संदेह है कि एक अधिक प्रभावी/सुविधाजनक तरीका हो सकता है लेकिन अब तक कुछ भी उपयोगी नहीं हो सका। किसी भी मदद/आपके विचारों की बहुत सराहना की जाती है।

std::vector<unsigned char> my_vec; 
my_vec.push_back('a'); 
my_vec.push_back('b'); 
my_vec.push_back('c'); 
my_vec.push_back('\n'); 

// make an imput stream from my_vec 
std::stringstream is; 
is.rdbuf()->pubsetbuf(reinterpret_cast<char*>(&my_vec[0]), my_vec.size()); 

// dump the input stream into stdout 
std::cout << is.rdbuf(); 

@NeilKirk:

बेस्ट, जे आर

+2

मुझे नहीं लगता कि आप ** ** ** ** ** ** ** ** की अपेक्षा कैसे करते हैं। –

+0

हां, आप एक ** istream ** पर << ऑपरेटर का वास्तव में उपयोग कैसे करते हैं? – HighCommander4

+0

प्रासंगिक? http://stackoverflow.com/questions/9319813/overloading-operator-for-c-stl-containers/9320896#9320896 – BoBTFish

उत्तर

7
vector<unsigned char> values; 
// ... 

stringstream ioss;  
copy(values.begin(), values.end(), 
    ostream_iterator<unsigned char>(ioss,",")); 

// doSomething(a, b, ioss, d, e, f, g); 
+0

मुझे सही दिशा में इंगित करने के लिए धन्यवाद! 'स्ट्रिंगस्ट्रीम एसएस; प्रतिलिपि (value.begin(), value.end(), ostream_iterator (एसएस, "")); ' पूरी तरह से काम करता है! –

15

वर्णों के vector एक अंतर्निहित बफर के रूप में एक इनपुट स्ट्रीम के लिए वेक्टर की सामग्री को कॉपी किए बिना उपयोग कर सकते हैं रिपोर्ट करता है कि the above method of using pubsetbuf is non-portable

एक पोर्टेबल तरीका boost::iostreams लाइब्रेरी का उपयोग करना है। इस प्रकार अपनी सामग्री की प्रतिलिपि किए बिना वेक्टर से इनपुट स्ट्रीम बनाने का तरीका है:

#include <iostream> 
#include <vector> 

#include <boost/iostreams/device/array.hpp> 
#include <boost/iostreams/stream.hpp> 

int main() { 
    std::vector<unsigned char> my_vec; 
    my_vec.push_back('a'); 
    my_vec.push_back('b'); 
    my_vec.push_back('c'); 
    my_vec.push_back('\n'); 

    // Construct an input stream from the vector. 
    boost::iostreams::array_source my_vec_source(reinterpret_cast<char*>(&my_vec[0]), my_vec.size()); 
    boost::iostreams::stream<boost::iostreams::array_source> is(my_vec_source); 

    // Dump the input stream into stdout. 
    std::cout << is.rdbuf(); 
} 
+2

यह क्यों कम किया गया था? यह एक वैध विकल्प है, imho। – jrok

+0

यह एक अच्छा विकल्प है, मेरे उत्तर से अधिक कुशल है। –

+0

वेक्टर डेटा के सूचक को आसानी से अमान्य कर दिया गया है। फिर भी, स्ट्रिंगस्ट्रीम की अस्थायीता इसे उचित रूप से सुरक्षित बनाती है। इसे ध्यान में रखते हुए, यह एक अच्छा जवाब है। – Zoomulator

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