raspberry-pi-logo

Raspberry PiでIoTなシステム開発:libconfigを使ってみる

Posted on Posted in 趣味的なIT・ネットの話題

Cから作ったバイナリの挙動をコンパイルせずに変えたいので、コンフィギュレーションファイルを読み込む仕様にしようと思いたちましが。が、自分でパーサーを書くのは面倒くさい。そこで調べてみたのですが、この類のパーサーは山ほど有るんですね。とりあえず頻出になっているlibconfigを試用してみました。

インストール

マニュアルに何故か普通のインストール手順が書かれていません。半分推測でインストールしてみました。apt-getには無かったです。

サンプルファイルの実行

最初のmakeで既にビルドが終わっていました。

サンプルのコンフィギュレーションファイルの中身がこちら。

ファイルが存在しない場合のエラー処理

ファイルが無い場合のエラーに対応できます。

ファイル名を変えてみたらこんな感じに。

単一キーを探して値を取得

シンプルな記法ですね。配列ではない要素を取得する場合はconfig_lookup_string()。

cfgの中のnameをnamuに変えてみると。

連想配列である多次元配列

連想配列と通常の配列の多次元配列を取得。配列ではないデータはconfig_t型から直接参照していたけれども、配列は一次の名称で指定してconfig_setting_t型の変数をセットし、これをキーにしてデータを取得する。多次元配列なのでconfig_setting_t型の変数をまたセットして、中身にアクセスする。config_setting_length()で要素数が取得できるので繰り返し。配列中の行数で取得する場合はconfig_setting_get_elem()、要素名で取得する場合はconfig_setting_lookup_string()。

メモリ解放

config_init()で確保したメモリを、config_destroy()で解放。が、マニュアルには”deallocating all memory associated with the configuration, but does not attempt to deallocate theconfig_t structure itself.”と書かれていて解放しているのか解放していないのかよく分かりません。どういう意味だろう。

設定ファイルに加筆

example2.cが既存ファイルに加筆をするサンプル

実行するとupdated.cfgが生成される。

さっきのexample1の対象のファイルを修正してからmake

確かに追加されている。

設定ファイルの中身を見ても確かに変更されている。フォーマッティングが変更されてしまうのが難かな。

いずれにせよ自分でパーサーの仕様を考えて書くより200倍ぐらい楽なので使ってみることにします。


Facebooktwittergoogle_pluspinterestlinkedinmail
納得したらすぐにシェア!