8

サードパーティのlibに含まれ、バイナリファイルデータが転送される入力ストリームオブジェクトを期待する関数を利用しようとしています。

署名は次のようになります。

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

このサードパーティのlib/functionを変更/変更できないため、「my」コードに適合させる必要があります。呼び出し場所には、istreamオブジェクトで渡されることが期待されるデータを含むstd::vectorがあります。現在、ベクトルを反復処理し、<<演算子を使用してバイトごとにコピーすることにより、ベクトルをストリームにコピーしています。

もっと効果的で便利な方法があるのではないかと強く思いますが、今のところ有用なものは見つかりませんでした。どんな助け/あなたの考えも大歓迎です。

最高、JR

4

2 に答える 2

16

vectorベクトルの内容をコピーせずに、入力ストリームの基になるバッファとして文字のを使用できます。

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は、上記の使用方法はpubsetbuf移植性がないと報告しています。

ポータブルな方法の1つは、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();
}
于 2012-02-20T08:59:29.777 に答える
8
vector<unsigned char> values;
// ...

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

// doSomething(a, b, ioss, d, e, f, g);
于 2012-02-20T08:59:08.857 に答える