INI ファイルからデータを読み込む
Siv3D Advent Calendar 2013, 2 日目の記事です。
今日は INI ファイルからデータを読み込む方法を紹介します。
INI ファイルは設定を記述するのに便利なテキストフォーマットです。
test1.ini
[AAA] aaa = 50 bbb = 1.234 ccc = Hello ; コメント [BBB] aaa = (20, 50) bbb = (255,128,0) ccc = ((80,80),(120,120),(80,120))
このファイルを読み込んで、Siv3D のデータ型に変換しましょう。
読み込みの関数は INIReader::get
INIReader::getOptionl
# include <Siv3D.hpp> void Main() { const INIReader ini(L"test1.ini"); const int AAAaaa = ini.get<int>(L"AAA.aaa", 0); const double AAAbbb = ini.get<double>(L"AAA.bbb", 0.0); const String AAAccc = ini.get<String>(L"AAA.ccc", L""); Println(AAAaaa, L' ', AAAbbb, L' ', AAAccc); if (const auto value = ini.getOptional<int>(L"AAA.ccc")) Println(value.get()); else Println(L"読み込みに失敗"); if (const auto value = ini.getOptional<int>(L"AAA.xxx")) Println(value.get()); else Println(L"読み込みに失敗"); Println(ini.get<int>(L"AAA.yyy", -123)); Println(ini.get<Point>(L"BBB.aaa", { 0, 0 })); ini.get<Triangle>(L"BBB.ccc", { 0, 0, 0 }).draw(ini.get<Color>(L"BBB.bbb", { 0, 0, 0 })); WaitKey(); }
結果
INIReader で読み込んだ INI ファイルが実行中に変更されると、INIReader::hasChanged() が true を返します。INIReader::reload() すると INI ファイルをロードしなおします。
次のプログラムを動かして、実行中に INI ファイルを編集してみましょう。
test2.ini
; 長方形のプロパティ [Rectangle] rect = (20, 50, 200, 50) color = (255,64,128) frame = true frameThickness = 5 frameColor = (255,255,128) ; 長方形内のテキストのプロパティ [Content] text = Hello textColor = (255,255,255)
# include <Siv3D.hpp> void Main() { const Font font{ 20 }; INIReader ini(L"test2.ini"); Rect rect = ini.get<Rect>(L"Rectangle.rect", { 0, 0, 0, 0 }); Color color = ini.get<Color>(L"Rectangle.color", { 0, 0, 0 }); bool frame = ini.get<bool>(L"Rectangle.frame", false); int frameThickness = ini.get<int>(L"Rectangle.frameThickness", 1); Color frameColor = ini.get<Color>(L"Rectangle.frameColor", { 0, 0, 0 }); String text = ini.get<String>(L"Content.text", L""); Color textColor = ini.get<Color>(L"Content.textColor", { 0, 0, 0 }); while (System::Update()) { rect.draw(color); if (frame) { rect.drawFrame(0, frameThickness, frameColor); } font.drawCenter(text, rect.center, textColor); if (ini.hasChanged()) { ini.reload(); rect = ini.get<Rect>(L"Rectangle.rect", { 0, 0, 0, 0 }); color = ini.get<Color>(L"Rectangle.color", { 0, 0, 0 }); frame = ini.get<bool>(L"Rectangle.frame", false); frameThickness = ini.get<int>(L"Rectangle.frameThickness", 1); frameColor = ini.get<Color>(L"Rectangle.frameColor", { 0, 0, 0 }); text = ini.get<String>(L"Content.text", L""); textColor = ini.get<Color>(L"Content.textColor", { 0, 0, 0 }); } } }
結果の一例
INI ファイルを編集すると即座に変更が反映されます。
アプリ制作で微調整が必要な個所では INIReader が大いに役立ちます。