Travailler avec YAML en C++ : la bibliothèque yaml-cpp
YAML (YAML Ain't Markup Language) est un format de sérialisation de données lisible par l'homme, souvent utilisé pour les fichiers de configuration, l'échange de données et le stockage d'informations structurées. En C++, il existe une bibliothèque puissante et simple d'utilisation pour travailler avec YAML : yaml-cpp. Dans cet article, nous allons voir en détail comment installer, configurer et utiliser yaml-cpp pour analyser et créer des documents YAML.
Installation de yaml-cpp
La bibliothèque yaml-cpp est disponible pour la plupart des plateformes. Le moyen le plus simple de l'installer est via un gestionnaire de paquets :
- Ubuntu/Debian :
sudo apt-get install libyaml-cpp-dev - macOS (Homebrew) :
brew install yaml-cpp - Windows (vcpkg) :
vcpkg install yaml-cpp
Vous pouvez également la compiler à partir des sources en téléchargeant le dépôt GitHub et en utilisant CMake :
git clone https://github.com/jbeder/yaml-cpp.gitcd yaml-cppmkdir build && cd buildcmake ..makesudo make installFondamentaux de yaml-cpp
La bibliothèque fournit une API intuitive pour charger, modifier et sauvegarder des données YAML. Tous les types de données sont stockés dans le conteneur YAML::Node, qui peut être un scalaire, une séquence (tableau) ou un mapping (dictionnaire).
Exemple de fichier YAML
Considérons le fichier de configuration suivant 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.1Analyse d'un fichier YAML
Pour charger des données à partir d'un fichier, on utilise la fonction YAML::LoadFile() :
#include <yaml-cpp/yaml.h>#include <iostream>#include <string>#include <vector>
int main() { try { // Chargement du fichier YAML YAML::Node config = YAML::LoadFile("config.yaml");
// Accès aux données imbriquées via l'opérateur [] 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;
// Travail avec une séquence (liste) 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;}Création et sérialisation YAML
yaml-cpp permet également de créer des documents YAML par programmation et de les sauvegarder dans un fichier :
#include <yaml-cpp/yaml.h>#include <fstream>
int main() { // Création du nœud racine YAML::Node config;
// Ajout de données config["application"]["name"] = "MyApp"; config["application"]["version"] = 2.1; config["application"]["debug"] = false;
// Création d'une séquence config["features"].push_back("logging"); config["features"].push_back("caching"); config["features"].push_back("auth");
// En Aussi dans la bibliothèque
Client OAuth pour C# (.NET) : implémentation de l'autorisation via des services tiers
Jetons JWT en JavaScript (Node.js) : Guide complet
Planificateur de tâches PHP : gestionnaire de files d'attente de type cron en PHP