テキストファイル内で使われている文字を数える 続き
昨日の続き。
ワイド文字版。
#include <iostream> #include <map> #include <boost/range/algorithm/for_each.hpp> #include <boost/range/adaptor/sliced.hpp> #include <boost/range/as_array.hpp> #include <pstade/oven/file_range.hpp> int main(){ namespace oven = pstade::oven; namespace adaptors = boost::adaptors; auto frange = oven::file_range<wchar_t>("空にとける虹と君の声.txt"); std::map<wchar_t, int> count; BOOST_FOREACH(wchar_t key, frange|adaptors::sliced(1, boost::distance(frange))){ count[key]++; } // 結果の出力 std::wcout.imbue(std::locale("japanese")); boost::for_each(count, [](std::pair<wchar_t, int> c){ std::wcout << c.first << ":" << c.second << std::endl; }); return 0; }
読み込んでくるファイルは、Unicode 形式で保存。
ファイルの先頭2バイトは識別文字になってるみたいなので1つずらして読み込んでいる。
やはりワイド文字の扱いはややこしい。
adaptors::sliced の第二引数がない場合は、
boost::distance に置き換えて欲しいと思ったり思わなかったり。
各文字のカウントの処理は、boost::count を使うよりこっちの方がスマートな気がする。
改行コード辺りも読み飛ばしたいな。
range は割といろんな事が出来るので使ってて楽しい。
あと boost::range でも pstade::oven でもいいからの日本語版リファレンスが欲しい。
英語版も読めなくはないが、欲しい機能を探すのに時間がかかる。
一通りの機能を試せば一番いいんだけども・・・さて、どうするか。
使った機能の一覧でもどっかに書くかな。
[追記]
作りました。
[boost/pstade]
ver 1.44.0 / ver 1.04.3