前回はコマンドラインオプションの取得用ライブラリ getopt でした。今回は、ファイルに書き込まれたコンフィギュレーション設定を読み取るための libconfigを使ってみます。最近私はPythonではJSON形式使っていますが、libconfigも分かり易いのではないかと。勿論、読み書き両対応。C/C++にも両対応。
※ソフトな忘却力 投稿順 index はこちら
(前回はラズパイ3で実習?でしたが、今回はラズパイ4です。まあラズパイでも他のLinuxでもきっと変わりませんが。)
以下に、libconfig のメンテナンスをしておられる Mark Lindner氏(hyperrealm) による libconfigのページへのリンクを貼り付けておきます。
libconfig, C/C++ library for processing configuration files
XMLやJSON同様、構造化された記述方法のコンフィギュレーション・ファイル(テキスト・ファイル)を読み取って、文字列でも数値でも設定値を読み取り、あるいは設定してファイルに書き戻しもできるライブラリです。でもま、簡単には、
A = B;
式の行を読み取ってAという名のコンフィギュレーションの設定値はB、などと使うのが一番ありじゃないかとおもいます。
インストレーション
CでもC++でも使えるライブラリなのですが、Raspberry Pi OS<32bit>(昔のRaspbian OS)上では、C用とC++用のパッケージがレポジトリに準備されているようでした。
-
- libconfig++-dev
- libconfig-dev
こちらでは C言語で古臭くやっているのでC用選択します。ラズパイ上へ開発用のファイル類一式インストールする場合は以下でOKです。
$ sudo apt install libconfig-dev
コンフィグレーションファイル simple.cfg
公式ドキュメントを読んでいただければわかりますが、階層構造を持ち、ArrayとかListとか構造をもったデータのカッコいいコンフィギュレーション・ファイルを利用可能です。しかし今回は、最低線にシンプルな以下のファイルを使用したいと思います。名前=値;という形のみ。私はこんな形式で10~20行もあれば、十分なことが多いです。
a_setting = "ASETTING"; b_setting = 133;
Cソース simple.Config.c
キメウチのファイル名で、エラー表示とか無の、2要素取り出しのみのシンプルな利用例であります。一応文字列取り出しと数値取り出しあり。
#include <stdio.h> #include <stdlib.h> #include <libconfig.h> int main(int argc, char **argv) { config_t cfg; const char *str; int ival; config_init(&cfg); if (!config_read_file(&cfg, "simple.cfg")) { return(EXIT_FAILURE); }; if(config_lookup_string(&cfg, "a_setting", &str)) { printf("a_setting: %s\r\n", str); } if(config_lookup_int(&cfg, "b_setting", &ival)) { printf("b_setting: %d\r\n", ival); } config_destroy(&cfg); return(EXIT_SUCCESS); }
ビルド
特に何もありません、リンクするライブラリに -lconfig 指定するだけ。
$ gcc simpleConfig.c -o simpleConfig -lconfig
実行結果
コンフィギュレーションファイルに書いてある内容が「ちゃんと」読み取られていました。
$ ./simpleConfig a_setting: ASETTING b_setting: 133
ライブラリの海は広大、次はどこへ行こうか?