連結
-
toml++ - github
-
toml++ - 幫助文件
-
使用要求: c++ 17 及以上版本
-
toml語法-英文
-
toml語法-中文
toml讀取
- 參見官方給出的範例
toml寫入
目標:表巢狀子表陣列的寫入
- 比如:
- 檔案內容
[NET_INTERFACE]
bool = false
bool_arr = [ false, false ]
complex_arr = [ false, '456', 123 ]
integer = 1234567890
integer_arr = [ 1, 0 ]
str_arr = [ '1', '0' ]
string = 'this is a string'
[[NET_INTERFACE.fruit]]
kilograms = 2
name = 'banana'
[[NET_INTERFACE.fruit]]
kilograms = 1
name = 'apple'
[[NET_INTERFACE.fruit]]
kilograms = 3
name = 'blueberry'
寫檔案 程式碼
tableNodeInsert
函式定義
/// @brief 插入非string節點
/// @param whichTable -哪個表
/// @param key - 插入的資料值
/// @param value -值
template<typename T>
static void tableNodeInsert(toml::table& whichTable, const std::string& key, const T& value)
{
whichTable.insert_or_assign(key, toml::value<T>(value));
}
- 生成檔案程式碼
NetInterfaceConfigPropertyName propertyName;
toml::table rootNode{};
tableNodeInsert<std::string>(rootNode, "string", "this is a string");
tableNodeInsert<bool>(rootNode, "bool", false);
tableNodeInsert<int64_t>(rootNode, "integer", 1234567890);
toml::table netInterfaceNode{};
/// 建立[NET_INTERFACE]
netInterfaceNode.insert_or_assign(propertyName.m_tableName, rootNode);
/// 下一是一個陣列的寫入
{
/// 定義了水果資訊
struct FruitInfo
{
/// 水果的名稱
std::string m_name{""};
/// 水果的重量
int64_t m_kilograms{0};
};
/// <key-水果的名稱,value-水果資訊>
using HashFruitInfo = std::unordered_map<std::string, FruitInfo>;
HashFruitInfo fruitInfoHash{{"apple", {"apple", 1}}, {"banana", {"banana", 2}}, {"blueberry", {"blueberry", 3}}};
toml::array tmpArr;
// for(auto& [key, value] : tmpArr)
for (HashFruitInfo::iterator it = fruitInfoHash.begin(); it != fruitInfoHash.end(); ++ it)
{
toml::table tblTmp{};
tableNodeInsert<std::string>(tblTmp, "name", it->first);
tableNodeInsert<int64_t>(tblTmp, "kilograms", it->second.m_kilograms);
tmpArr.insert(tmpArr.begin(), tblTmp);
}
/// 將陣列中的內容 - 關鍵程式碼
netInterfaceNode[propertyName.m_tableName].as_table()->insert_or_assign("fruit", tmpArr);
}
/// 使用流開啟檔案
std::ofstream tomlFile(std::string{"example.toml"}, std::ios::out | std::ios::trunc);
if (tomlFile.is_open())
{
// 使用 toml++ 的內建方法將 TOML 值寫入檔案
tomlFile << netInterfaceNode;
tomlFile.close();
}
else
{
/// TODO
}
陣列寫入的關鍵程式碼
/// 將陣列中的內容-關鍵程式碼
netInterfaceNode[propertyName.m_tableName].as_table()->insert_or_assign("fruit", tmpArr);