前回と前々回に引き続き、Boost C++ Librariesを使ってみる。
今回はせっかくなので、使えそうなものを作ろうということで「設定ファイル読み込みクラス」を作成知ることにした。仕様は以下の通り。
- 設定ファイルのパスを引数としてインスタンス化
- 「#」の後ろはコメント
- 設定ファイル内では「変数名=値」と記述
- 「値」を「,」で区切って記載した場合は配列として読み込む
- 「param(変数名)」または「param(変数名, 添え字)」メソッドを使用して値にアクセスする
- 「parse()」メソッドを実行することで、設定ファイルを読み込む
- とりあえず構文エラーは気にしない
ソースはこんな感じ( Configure.tar.gzをダウンロード)。それぞれのファイルは以下のようになっている。
- Configure.hpp : 設定ファイルクラスのヘッダー
- Configure.cpp : 設定ファイルクラスのソース
- def.hpp : 長い名前のtypedefなどをまとめて記載
- testConfigure.cpp : 実際に使ってみたサンプル
名前空間を定義しているが、これは個人的に後で使う予定との兼ね合いなので気にしないでほしい。
コンパイルは次のよう実行する。
# g++ -o testConf testConfigure.cpp Configure.cpp -lboost_system -lboost_filesystem
-lboost_filesystemはなくてもいけるかもしれない。
サンプルの設定ファイル(conffile.txt)は次のものを使っている。
- #aaa = aaa
- OPTION=0
- AUTHOR=INCHOKI #Author
- PATH=/aaa/aaa/bbb | aaabbbccc
- DIRPATH=aaa/bbb , 12345
- PARAMETER = xyz && aaaaaa
- VERSION = 0.1 # version
- TEST = AAA
サンプルを実行すると、次のような結果となる。
- MacBook:work inchoki$ ./testConf
- ./conffile.txt
- 0
- INCHOKI
- /aaa/aaa/bbb | aaabbbccc
- aaa/bbb
- xyz && aaaaaa
- 0.1
- AAA
ソースを貼り付けると長くなるので、parse()実行時の処理の概要だけ書くと、
- セパレータや正規表現を定義
- 設定ファイルをオープン
- 一行ずつ読み込む
- 先頭がコメント文字の時は無視して次の行
- 「=」の両側のスペースを削除する
- 「#」で区切って、前の方だけを取り出す
- 「=」で区切る
- 値に文字列内の「,」があるか確認する
- 「,」がある場合はその両側のスペースを削除してから、「,」で区切る
- map変数に変数名をキーとして値を格納する。配列型とそれ以外は内部的には別変数に格納する。
それなりに動いたが、次に改良するとしたら
- やはり構文エラーを気にしないのはどうかと思う
- Parserクラスを作って、設定ファイルのフォーマットによってパーサを切り替えたい
- コピーコンストラクタは保護しているのに代入演算子は気にしてないとか、中途半端
- どうせなら設定管理クラスとしてシングルトンパターンを適用するとかしたほうがいいかも
- 名前がいけてない
- ドキュメントも作りましょう
といったところかと思っている。
コメント