概要
Qtには組み込みのTOMLパーサーが存在しないため、サードパーティ製ライブラリを使用する必要がある。
同期処理
TOMLの読み込み
以下の例では、toml++ライブラリを使用して、TOMLファイルを読み込んでいる。
toml++ライブラリを使用する場合は、プロジェクトにtoml++ライブラリをリンクする必要がある。
#include <QFile>
#include <QTextStream>
#include <stdexcept>
#include <toml++/toml.h>
class TomlHandler
{
public:
TomlHandler() = default;
// TOMLファイルを読み込む
toml::table readToml(const QString &filename)
{
try {
return toml::parse_file(filename.toStdString());
}
catch (const toml::parse_error &err) {
throw std::runtime_error(QString("TOMLファイルの解析エラー: %1").arg(err.description().c_str()).toStdString());
}
}
// TOMLデータから特定の値を取得 (テンプレート関数)
template<typename T>
T getValue(const toml::table &data, const QString &key)
{
try {
return data[key.toStdString()].value<T>();
}
catch (const toml::type_error &err) {
throw std::runtime_error(QString("値の取得エラー: %1").arg(err.what()).toStdString());
}
}
};
以下の例では、上記のクラスを使用してTOMLファイルを読み込んでいる。
#include <QDebug>
#include "TomlHandler.h"
int main()
{
TomlHandler handler;
try {
// TOMLファイルを読み込む
auto data = handler.readToml("config.toml");
// 値を取得する
QString name = handler.getValue<QString>(data, "name");
int age = handler.getValue<int>(data, "age");
qDebug() << "Name:" << name;
qDebug() << "Age:" << age;
}
catch (const std::exception &e) {
qCritical() << "エラー: " << e.what();
return -1;
}
return 0;
}
TOMLファイルの書き込み
以下の例では、toml++ライブラリを使用して、TOMLファイルを書き込んでいる。
toml++ライブラリを使用する場合は、プロジェクトにtoml++ライブラリをリンクする必要がある。
#include <QFile>
#include <QTextStream>
#include <stdexcept>
#include <toml++/toml.h>
class TomlHandler
{
public:
TomlHandler() = default;
// TOMLファイルを読み込む
toml::table readToml(const QString &filename)
{
try {
return toml::parse_file(filename.toStdString());
}
catch (const toml::parse_error &err) {
throw std::runtime_error(QString("TOMLファイルの解析エラー: %1").arg(err.description().c_str()).toStdString());
}
}
// TOMLデータをファイルに書き込む
void writeToml(const QString &filename, const toml::table &data)
{
QFile file(filename);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
throw std::runtime_error(QString("ファイルオープンエラー: %1").arg(filename).toStdString());
}
QTextStream out(&file);
out << QString::fromStdString(toml::toml_formatter(data).format());
file.close();
}
// TOMLデータから特定の値を取得 (テンプレート関数)
template<typename T>
T getValue(const toml::table &data, const QString &key)
{
try {
return data[key.toStdString()].value<T>();
}
catch (const toml::type_error &err) {
throw std::runtime_error(QString("値の取得エラー: %1").arg(err.what()).toStdString());
}
}
// TOMLデータに値を設定する (テンプレート関数)
template<typename T>
void setValue(toml::table &data, const QString &key, const T &value)
{
data[key.toStdString()] = value;
}
};
以下の例では、上記のクラスを使用してTOMLファイルを書き込んでいる。
#include <QDebug>
#include "TomlHandler.h"
int main()
{
TomlHandler handler;
try {
// TOMLファイルを読み込む
auto data = handler.readToml("config.toml");
// 値を取得
QString name = handler.getValue<QString>(data, "name");
int age = handler.getValue<int>(data, "age");
qDebug() << "Name:" << name;
qDebug() << "Age:" << age;
// 値を設定
handler.setValue(data, "location", "Tokyo");
// 変更したデータを書き込む
handler.writeToml("config_updated.toml", data);
}
catch (const std::exception &e) {
qCritical() << "エラー: " << e.what();
return -1;
}
return 0;
}