2012-03-19 7 views
1

私はposixパイプをgnuplotにラップするためにboost :: iostreamライブラリを使用しています。 gnuplotにインラインバイナリデータを送信するには、私は現在、このstd :: vectorのフォーマットされていないストリーム入力<double>

std::vector<double> d = test_data(); 
Gnuplot plt; //custom gnuplot class derived from boost::iostream::stream 

plt << "plot '-' binary format='%double' notitle\n" 
plt.write((char*)(&c.front()), sizeof(double)*c.size()); // send binary data 

のようなものをやっているそれは動作しますが、私は.WRITEを取り除くと、例えば許可するIteratorインターフェイスを使用取得したいのですがソースとしてのstd :: list std :: ostreambuf_iteratorはフォーマットされていない入力を許可しますが、単純にstd :: copyを使用することはできません。明らかに動作しません。ここで

+0

あなたがいるので、事は、これだけではない*任意の容器での作業*しかし 'vector'だろうということですオブジェクトタイプに関係なく、連続したメモリ範囲を書き込むだけです。しかし、イテレーターベースのラッパーは書くのが簡単です。 –

答えて

2

は範囲を書き出すための素朴なラッパーテンプレートです:

#include <memory> 
#include <iterator> 

template <typename FwdIter> 
write_range(Gnuplot & gp, FwdIter it, FwdIter end) 
{ 
    typedef typename std::iterator_traits<FwdIter>::value_type type; 
    for (; it != end; ++it) 
    { 
     gp.write(reinterpret_cast<char const *>(std::addressof(*it)), sizeof(type)); 
    } 
} 

は使用方法:write_range(gp, mylist.begin(), mylist.end());

関連する問題