cpptoml 是一个用于 C++ 的开源库,旨在提供对 TOML(Tom's Obvious, Minimal Language)格式的支持。它允许开发者轻松地在 C++ 项目中读取、解析和生成 TOML 格式的配置文件。cpptoml 是一个轻量级、易于使用的库,适用于那些希望将 TOML 格式作为配置文件格式的 C++ 项目。
主要特点:
- 简洁的 API:cpptoml 提供了一个易于使用的接口,支持从 TOML 配置文件中读取各种数据类型(如整数、浮动点数、字符串、布尔值、日期等)。
- 头文件库:cpptoml 是一个纯头文件库,意味着你不需要编译库,只需要包含相应的头文件即可。
- 支持嵌套结构:cpptoml 完全支持 TOML 的嵌套表格、数组以及其他复杂的数据结构。
- 类型安全:cpptoml 提供了类型安全的接口,确保你从 TOML 文件中获取的每个值都与其预期的数据类型匹配。
安装:
由于 cpptoml 是一个头文件库,你只需要下载源代码并将其包含在你的项目中即可。你可以从 GitHub 上下载最新版本:
GitHub 地址:点击跳转
mkdir build
cd build
cmake ../
make
#config.toml
[owner]
name = "Tom Preston-Werner"
dob = "1979-05-27T07:32:00Z"
[database]
server = "192.168.1.1"
ports = [ 8001, 8002, 8003 ]
connection_max = 5000
enabled = true
#include <iostream>
#include <chrono>
#include <string>
#include <sstream>
#include <iomanip>
#include <ctime>
#include "cpptoml.h"
int main(int argc, char *argv[])
{
// 载入 TOML 文件
auto config = cpptoml::parse_file("config.toml");
// 读取并输出 "owner" 部分的 name 和 dob
auto owner = config->get_table("owner");
std::string name = owner->get_as<std::string>("name").value_or("Unknown");
//std::string dob = owner->get_as<std::string>("dob").value_or("Unknown");
// 解析 "dob" 字段为字符串
auto dob_str = owner->get_as<std::string>("dob").value_or("");
if (!dob_str.empty()) {
// 转换字符串为 time_point (std::chrono)
std::tm tm = {};
std::istringstream ss(dob_str);
ss >> std::get_time(&tm, "%Y-%m-%dT%H:%M:%SZ");
if (ss.fail()) {
std::cout << "Failed to parse date-time." << std::endl;
return 1;
}
// 转换为 std::chrono::system_clock::time_point
std::time_t t = std::mktime(&tm);
auto dob = std::chrono::system_clock::from_time_t(t);
// 输出时间
std::time_t dob_time = std::chrono::system_clock::to_time_t(dob);
std::cout << "DOB: " << std::ctime(&dob_time); // 输出类似 "Sun May 27 07:32:00 1979"
} else {
std::cout << "'dob' field not found!" << std::endl;
}
std::cout << "Owner Name: " << name << std::endl;
// std::cout << "Owner DOB: " << dob << std::endl;
// 读取 "database" 部分的 server 和 ports
auto database = config->get_table("database");
std::string server = database->get_as<std::string>("server").value_or("Unknown");
auto ports = database->get_array_of<int64_t>("ports");
std::cout << "Database Server: " << server << std::endl;
std::cout << "Database Ports: ";
for (auto &port : *ports) {
std::cout << port << " ";
}
std::cout << std::endl;
return 0;
}
觉得有帮助的话,打赏一下呗。。
需要商务合作(定制程序)的欢迎私信!!