cpptoml介绍

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;
}

觉得有帮助的话,打赏一下呗。。

需要商务合作(定制程序)的欢迎私信!!