Работа с YAML в C++: библиотека yaml-cpp для парсинга и сериализации

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с YAML в C++: библиотека yaml-cpp

YAML (YAML Ain't Markup Language) — это человекочитаемый формат сериализации данных, который часто используется для конфигурационных файлов, обмена данными и хранения структурированной информации. В C++ для работы с YAML существует мощная и простая в использовании библиотека yaml-cpp. В этой статье мы подробно рассмотрим, как установить, настроить и использовать yaml-cpp для парсинга и создания YAML-документов.

Установка yaml-cpp

Библиотека yaml-cpp доступна для большинства платформ. Самый простой способ установки — через пакетный менеджер:

  • Ubuntu/Debian: sudo apt-get install libyaml-cpp-dev
  • macOS (Homebrew): brew install yaml-cpp
  • Windows (vcpkg): vcpkg install yaml-cpp

Также можно собрать из исходников, скачав репозиторий с GitHub и используя CMake:

git clone https://github.com/jbeder/yaml-cpp.git
cd yaml-cpp
mkdir build && cd build
cmake ..
make
sudo make install

Основы работы с yaml-cpp

Библиотека предоставляет интуитивно понятный API для загрузки, модификации и сохранения YAML-данных. Все типы данных хранятся в контейнере YAML::Node, который может быть скаляром, последовательностью (массивом) или отображением (словарем).

Пример YAML-файла

Рассмотрим следующий конфигурационный файл config.yaml:

database:
  host: localhost
  port: 5432
  name: myapp
  credentials:
    user: admin
    password: secret123

server:
  workers: 4
  timeout: 30.5
  debug: true

allowed_ips:
  - 192.168.0.1
  - 192.168.0.2
  - 10.0.0.1

Парсинг YAML-файла

Для загрузки данных из файла используется функция YAML::LoadFile():

#include <yaml-cpp/yaml.h>
#include <iostream>
#include <string>
#include <vector>

int main() {
    try {
        // Загружаем YAML-файл
        YAML::Node config = YAML::LoadFile("config.yaml");

        // Доступ к вложенным данным через оператор []
        std::string host = config["database"]["host"].as<std::string>();
        int port = config["database"]["port"].as<int>();
        std::string user = config["database"]["credentials"]["user"].as<std::string>();

        std::cout << "Database host: " << host << std::endl;
        std::cout << "Database port: " << port << std::endl;
        std::cout << "User: " << user << std::endl;

        // Работа с последовательностью (списком)
        YAML::Node ips = config["allowed_ips"];
        std::vector<std::string> ipList;
        for (const auto& ip : ips) {
            ipList.push_back(ip.as<std::string>());
        }

        std::cout << "Allowed IPs: ";
        for (const auto& ip : ipList) {
            std::cout << ip << " ";
        }
        std::cout << std::endl;

    } catch (const YAML::Exception& e) {
        std::cerr << "YAML Error: " << e.what() << std::endl;
        return 1;
    }

    return 0;
}

Создание и сериализация YAML

yaml-cpp также позволяет создавать YAML-документы программно и сохранять их в файл:

#include <yaml-cpp/yaml.h>
#include <fstream>

int main() {
    // Создаем корневой узел
    YAML::Node config;

    // Добавляем данные
    config["application"]["name"] = "MyApp";
    config["application"]["version"] = 2.1;
    config["application"]["debug"] = false;

    // Создаем последовательность
    config["features"].push_back("logging");
    config["features"].push_back("caching");
    config["features"].push_back("auth");

    // Вложенный словарь
    config["limits"]["max_connections"] = 100;
    config["limits"]["timeout_ms"] = 5000;

    // Сохраняем в файл
    std::ofstream fout("output.yaml");
    fout << config;
    fout.close();

    // Или выводим в поток                    

Рекомендаций