boost::iostreams

トップページ > 入出力 >

abstract

必要なヘッダ
<boost/iostreams/*.hpp>
出来ること
簡単iostreams作成
リファレンス
en

sample

#include <iostream>
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/concepts.hpp>
using namespace std;

// ひたすら無限にAが読み取れるストリームを作ろう
class all_a : public boost::iostreams::source
{
public:
	std::streamsize read( char* s, std::streamsize n )
	{
		for(int i=0; i!=n; ++i)
			*s++ = 'A';
		return n;
	}
};

int main()
{
	all_a aa;
	boost::iostreams::stream<all_a> s(aa);

	char ch;
	while( s >> ch ) cout << ch;
}

出力例

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...

etc

標準ライブラリのiostreamは使う側としては楽ですが、いざ、自作のストリームクラスを定義しようと思うと、 ちょこちょこお約束があって大変です。 ちなみに自作ストリームの作り方については 「iostreamの拡張」 という文書がわかりやすくまとまっています。オススメです。

それはともかくとして、Boost.Iostreamsは簡単に自作ストリームクラスを作るための補助ライブラリです。 入力ストリームを作るには、上のサンプルのようにreadメソッド1個実装してsourceから派生して streamテンプレートに渡せばOK。出力ストリームも同様にwriteメソッドを実装してsinkから派生して以下略。

さらに面白いのは、 sourceやsinkを使って定義したクラスに Filter をつなげて、unixのコマンドをパイプでつなぐような感覚で、 複雑な処理をするストリームを定義できる機能です。 [gzip圧縮するフィルタ (zlib_compressor())]→[ファイルへ書き込むsink (file_sink())] とつないで、書き込んだ内容を圧縮してファイルに書き出すストリームを作るなどなど。

see also

Takeshi Mouri さんによる Hamigaki.Audio は、Boost.Iostreams のコンセプトに基づいたオーディオ処理ライブラリだそうです。

presented by k.inaba (kiki .a.t. kmonos.net) under CC0