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(L"セクション.パラメータ", 失敗時の値) です。
INIReader::getOptionl は失敗時に none を返します。

# 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 が大いに役立ちます。