質問
私は、教育的な理由のためのC ++のostreamを作成しようとしています。私のテストではなく、それは両端キューまたはベクトルコンテナに記述したファイルへの書き込みを除く外ですofstreamのような働きのostreamを作成されます。
解決
それは教育のためであるとして、あなたが言うように、私は、このようなブツを行うだろうどのように表示されます。それ以外の場合は、stringstream
は本当に進むべき道です。
が鳴ります。このような何か(が目標とすることを、私の別の答えからコピー/ dev / nullストリームの):
template<typename Ch, typename Traits = std::char_traits<Ch>,
typename Sequence = std::vector<Ch> >
struct basic_seqbuf : std::basic_streambuf<Ch, Traits> {
typedef std::basic_streambuf<Ch, Traits> base_type;
typedef typename base_type::int_type int_type;
typedef typename base_type::traits_type traits_type;
virtual int_type overflow(int_type ch) {
if(traits_type::eq_int_type(ch, traits_type::eof()))
return traits_type::eof();
c.push_back(traits_type::to_char_type(ch));
return ch;
}
Sequence const& get_sequence() const {
return c;
}
protected:
Sequence c;
};
// convenient typedefs
typedef basic_seqbuf<char> seqbuf;
typedef basic_seqbuf<wchar_t> wseqbuf;
あなたはこのようにそれを使用することができます:
seqbuf s;
std::ostream os(&s);
os << "hello, i'm " << 22 << " years old" << std::endl;
std::vector<char> v = s.get_sequence();
あなたはシーケンスとして両端キューを持つようにしたい場合は、あなたがそうすることができます:
typedef basic_seqbuf< char, char_traits<char>, std::deque<char> > dseq_buf;
または似たような...まあ、私はそれをテストしていません。しかし、おそらくそれも良いことだ - そう、それはまだバグが含まれている場合、あなたはそれらを修正してみてください。
他のヒント
使用のstd ::にstringstream
#include <iostream>
#include <sstream>
int main()
{
std::stringstream s;
s << "Plop" << 5;
std::cout << s.str();
}
私はちょうどあなたがそのためのostreamのようなクラスを記述する必要がないことを注意しましょう。あなたは、あなたの目標を達成するためのアダプタを使用することができます。
たとえば、このコードのIStreamから読み出してベクターに各要素を挿入
vector<string> V;
copy(istream_iterator<string>(cin),
istream_iterator<string>(),
back_inserter(V));
あなたはそれを何をしたいのかについての詳細がなければ、あまりにも具体的には難しいですが、あなたは新しいのostreamを作成する必要はありません。何がやりたいことは、新しいタイプのストリームバッファを作成し、既存のostreamを使用している。
行うにeasyist事がSTDを継承することです:: basic_filebuf <>、および(同期をオーバーロード)し、データ構造に要素を追加するにはオーバーフロー()メソッドます。