C++

標準出力とファイルにログを出力したい

Iostreamsのtee_deviceを使って2つのデバイスに出力することにしました。 #include <iostream> #include <boost/iostreams/filtering_stream.hpp> #include <boost/iostreams/device/file.hpp> #include <boost/iostreams/tee.hpp> #include <boost/date_time/posix_time/posix_time.hpp> namespace myns{ namespace io = boost::iostreams; io::fil…</boost/date_time/posix_time/posix_time.hpp></boost/iostreams/tee.hpp></boost/iostreams/device/file.hpp></boost/iostreams/filtering_stream.hpp></iostream>

'\n'などを含む文字列のパターンマッチ

C++標準の正規表現ライブラリにおいて、'.'は'\n'や'\t'などにマッチしません。 しかしBoost.Regexはデフォルトでは'.'にマッチするようになっています。 #include <iostream> #include <regex> #include <boost/regex.hpp> int main(){ std::string text = "ABC\nXYZ"; std::smatch std_result</boost/regex.hpp></regex></iostream>…

Boost1.50.0でリリースされた、Boost.Functional/Overloaded Function

複数の異なる関数を、ひとつの関数オブジェクトにオーバーロードすることができるライブラリです。 同目的で異なる名前、引数の型を持つ関数のあるC時代のライブラリを使うときに重宝しそうです。 #include <iostream> #include <sstream> #include <boost/functional/overloaded_function.hpp> std::string concat_s(const</boost/functional/overloaded_function.hpp></sstream></iostream>…

Boost.IostreamsのFilter作成!

Filterはデータに対して何らかの処理をするために使います。 作成したいコンセプトのクラスを継承し、それに対応するメンバを定義することで、簡単に作ることができます。ここではデータを逆順に出力するFilterを作成します。 #include <iostream> #include <boost/iostreams/filtering_stream.hpp> #include <boost/iostreams/device/back_inserter.hpp></boost/iostreams/device/back_inserter.hpp></boost/iostreams/filtering_stream.hpp></iostream>…

file_source, sinkとfile_descriptor_source, sink

使用する上で目立った違いは、改行コードの扱いでした。file_source, sinkは、ファイル読み込みの際、改行コード"\r\n"を"\n"に変換します。 そして書き込む際、"\n"を"\r\n"に変換して出力します。 これはstd::ifstream, ofstreamと同じ動作です。file_desc…

STLコンテナをSink/Sourceとして使う

Iostreamsでは、コンテナを入力元(Source)、出力先(Sink)として使うことができます。 Sourceとして使うには、boost::make_iterator_range関数を、 また、Sinkとして使うには、boost::iostreams::back_inserter関数を使います。 ファイルに書き出したりせず、…

stream, filtering_streamのコンストラクタとパイプライン

これらのコンストラクタはいくつかオーバーロードされてるのですが、 なるべく短いコードで書きたい(I/Oが行える状態にしたい)です。書きましょう。streamのコンストラクタ引数は、Deviceのコンストラクタ引数と同じものを取ります。 namespace io = boost::…

すぐにフィルタ処理を終えたいときはboost::iostreams::closeを使う

filtering_ostream::flushを呼び出すことで処理が完了すると思っていたのですが、そうでない場合がありました。 #include <iostream> #include <vector> #include <boost/iostreams/filtering_stream.hpp> #include <boost/iostreams/filter/gzip.hpp> #include <boost/iostreams/device/back_inserter.hpp> #include <boost/iostreams/copy.hpp> int main(){ namesp…</boost/iostreams/copy.hpp></boost/iostreams/device/back_inserter.hpp></boost/iostreams/filter/gzip.hpp></boost/iostreams/filtering_stream.hpp></vector></iostream>

Boost.IostreamsのFilterを使う!

Boost.IostreamsにはFilterというものがあります。 これを使うことでストリームから入力、ストリームへ出力するデータを加工できます。 #include <iostream> #include <boost/iostreams/filtering_stream.hpp> #include <boost/iostreams/filter/gzip.hpp> #include <boost/iostreams/device/file_descriptor.hpp> int main(){ namespace io = boost::iostreams; //データをgzip圧縮してフ…</boost/iostreams/device/file_descriptor.hpp></boost/iostreams/filter/gzip.hpp></boost/iostreams/filtering_stream.hpp></iostream>

Boost.Iostreamsでストリーム作成!

Boost.Iostreamsでできることのひとつとして、ストリームの作成が簡単にできる、というのがあります。それには、まず入出力するデータをやりとりするクラスを作ります。 (このクラスをDeviceといいます。また、出力DeviceはSink、入力DeviceはSourceと呼ばれ…

Boostで利用するzlibライブラリのビルド(Windows)

Boost.Iostreamsを利用してgzip圧縮・展開をすることができます。 そのためにはzlibというライブラリをビルドする必要があります。 UNIX系のOSではbjamを実行した際、デフォルトでビルドされるよう設定されているのですが、Windowsでは無効になっています。 …

Boost.Date TimeのGregorianで日付の処理

ある年がうるう年か調べたり、日付の足し引きをしたり、残り日数を求めたりできる便利機能が一通り揃ってます。 from_stringに文字列を渡してインスタンスを生成できるのもいいですね。 #include <iostream> #include <boost/date_time/gregorian/gregorian.hpp> #include <boost/format.hpp> int main(){ using namespace std; nam</boost/format.hpp></boost/date_time/gregorian/gregorian.hpp></iostream>…

std::getlineで文字区切り

C++

以下はstd::getlineにstd::stringstreamを渡した場合と、std::cinを渡した場合です。 #include <iostream> #include <sstream> template<class Istr> void show_separated_str(Istr& istr, char delim){ std::string str; while(std::getline(istr, str, delim)){ std::cout << str << std::</class></sstream></iostream>…

入力ストリームで数値を切り出す

C++

char型変数で1文字取って捨ててます。 #include <iostream> int main(){ int y, m, d; char c; std::cin >> y >> c >> m >> c >> d; std::cout << y << "年" << m << "月" << d << "日" << std::endl; return 0; } Input: 2012/05/18 Output: 2012年5月18日 標準入力で</iostream>…

64bitアプリケーション開発におけるsize_t型

C++

x64環境に移って、考えなしにunsigned intでstd::string::find()の戻り値を受け取ったりしていたら、実行時にエラーで躓いたので。コンパイラはgcc4.6.3、ターゲットはx64です。 x64ではlong型が8bytesに、そしてsize_tはunsigned intではなくunsigned long…