Travailler avec YAML en C++ : bibliothèques yaml-cpp et rapidyaml

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Travailler avec YAML en C++ : bibliothèques yaml-cpp et rapidyaml

\n\n

YAML (YAML Ain't Markup Language) est un format de sérialisation de données largement utilisé pour les fichiers de configuration, les fichiers de description d'environnement (Docker Compose, Kubernetes), ainsi que pour l'échange de données entre services. Contrairement à JSON, YAML est plus lisible pour l'homme grâce à l'indentation et au support des commentaires.

\n\n

En C++, il n'y a pas de support intégré pour YAML, mais il existe d'excellentes bibliothèques tierces. Dans cet article, nous examinerons les deux plus populaires : yaml-cpp (classique, simple) et rapidyaml (moderne, très rapide). Vous apprendrez à installer les bibliothèques, à lire un fichier YAML, à le créer par programmation et à gérer les erreurs typiques.

\n\n

1. Bibliothèque yaml-cpp

\n\n

yaml-cpp est la bibliothèque de facto standard pour travailler avec YAML en C++. Elle fournit une API pratique, rappelant le travail avec les conteneurs STL. La bibliothèque prend en charge la spécification YAML 1.2.

\n\n

Installation

\n\n

Le moyen le plus simple est d'utiliser le gestionnaire de paquets vcpkg ou Conan. Pour Linux/macOS :

\n\n
# Installation via vcpkg\nvcpkg install yaml-cpp\n\n# Installation via Conan\nconan install yaml-cpp/0.7.0@
\n\n

Si vous préférez compiler manuellement, téléchargez les sources depuis GitHub et exécutez :

\n\n
mkdir build && cd build\ncmake ..\ncmake --build .\nsudo cmake --install .
\n\n

Parsing d'un fichier YAML

\n\n

Supposons que nous ayons un fichier de configuration config.yaml :

\n\n
server:\n  host: "localhost"\n  port: 8080\n  debug: true\n\ndatabase:\n  driver: "postgresql"\n  connection_string: "host=localhost dbname=test"\n  pool_size: 10
\n\n

Exemple de lecture et d'accès aux données en C++ :

\n\n
#include <yaml-cpp/yaml.h>\n#include <iostream>\n#include <string>\n\nint main() {\n    try {\n        // Chargement du fichier\n        YAML::Node config = YAML::LoadFile("config.yaml");\n\n        // Accès aux nœuds imbriqués\n        std::string host = config["server"]["host"].as<std::string>();\n        int port = config["server"]["port"].as<int>();\n        bool debug = config["server"]["debug"].as<bool>();\n\n        std::cout << "Server: " << host << ":" << port\n                  << " (debug=" << (debug ? "on" : "off") << ")\\n";\n\n        // Vérification de l'existence d'une clé\n        if (config["database"]["pool_size"]) {\n            int pool = config["database"]["pool_size"].as<int>();\n            std::cout << "Pool size: " << pool << "\\n";\n        }\n\n        // Itération sur une séquence (liste)\n        // Supposons que le YAML contienne un champ : hosts: ["alpha", "beta", "gamma"]\n        // for (const auto& h : config["hosts"]) {\n        //     std::cout << "Host: " << h.as<std::string>() << "\\n";\n        // }\n\n    } catch (const YAML::Exception& e) {\n        std::cerr << "YAML parsing error: " << e.what() << "\\n";\n        return 1;\n    } catch (const std::exception& e) {\n        std::cerr << "General error: " << e.what() << "\\n";\n        return 1;\n    }\n    return 0;\n}
\n\n

Création d'un document YAML

\n\n

Avec yaml-cpp, on peut non seulement lire, mais aussi générer du YAML :

\n\n
#include <yaml-cpp/yaml.h>\n#include <fstream>\n\nint main() {\n    YAML::Emitter out;\n    out << YAML::BeginMap;\n    out << YAML::Key << "application";\n    out << YAML::Value << "MyApp";\n    out << YAML::Key << "version";\n    out << YAML::Value << 2.5;\n    out << YAML::Key << "features";\n    out << YAML::Value << YAML::BeginSeq;\n    out << "logging" << "auth" << "cache";\n    ou                    

Recommendations