yaml-cpp C++: पूर्ण गाइड उदाहरणों के साथ

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

yaml-cpp C++: पूर्ण गाइड उदाहरणों के साथ

1. यह क्या है और इसकी आवश्यकता क्यों है

yaml-cpp C++ में YAML फ़ाइलों को पार्स और जनरेट करने के लिए एक हल्की, आधुनिक लाइब्रेरी है। YAML (YAML Ain't Markup Language) एक डेटा सीरियलाइज़ेशन फ़ॉर्मेट है जो इंसानों के पढ़ने के लिए आसान है। इसका उपयोग अक्सर कॉन्फ़िगरेशन फ़ाइलों, डेटा स्ट्रक्चर विवरण, CI/CD पाइपलाइनों (जैसे GitHub Actions, GitLab CI) और सेवाओं के बीच डेटा एक्सचेंज के लिए किया जाता है। JSON के विपरीत, YAML कमेंट, मल्टी-लाइन स्ट्रिंग, एंकर और एलियास को सपोर्ट करता है, जो इसे कॉन्फ़िगरेशन के लिए आदर्श बनाता है।

yaml-cpp का उपयोग क्यों करें? अगर आप C++ में कोई एप्लिकेशन लिख रहे हैं जिसे कॉन्फ़िगरेशन फ़ाइलें पढ़नी हैं (जैसे सर्वर सेटिंग्स, मशीन लर्निंग मॉडल पैरामीटर, डिपेंडेंसी विवरण), तो yaml-cpp एक सरल और टाइप-सेफ API प्रदान करता है। यह लाइब्रेरी YAML 1.2 स्पेसिफिकेशन का पूरी तरह से पालन करती है, सभी डेटा प्रकारों (स्केलर, सीक्वेंस, मैपिंग) को सपोर्ट करती है, और YAML डॉक्यूमेंट को C++ स्ट्रक्चर में और वापस आसानी से बदलने की सुविधा देती है।

मुख्य लाभ: न्यूनतम डिपेंडेंसी (केवल C++11/14/17 स्टैंडर्ड लाइब्रेरी), हेडर-ओनली वैकल्पिक बिल्ड, यूनिकोड सपोर्ट, कस्टम टाइप्स के लिए कस्टम सीरियलाइज़ेशन, और सक्रिय कम्युनिटी (GitHub पर 5 हज़ार से अधिक स्टार्स)।

2. इंस्टॉलेशन

yaml-cpp भाषा-विशिष्ट पैकेज मैनेजर (pip, npm) के माध्यम से इंस्टॉल नहीं होता। C++ के लिए सिस्टम पैकेज मैनेजर या सोर्स से बिल्ड का उपयोग किया जाता है।

Linux (Debian/Ubuntu)

sudo apt-get install libyaml-cpp-dev

macOS (Homebrew)

brew install yaml-cpp

Windows (vcpkg)

vcpkg install yaml-cpp

सोर्स से बिल्ड (CMake)

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

इंस्टॉलेशन के बाद, CMakeLists.txt में लाइब्रेरी को लिंक करें:

find_package(yaml-cpp REQUIRED)
target_link_libraries(my_project yaml-cpp)

3. त्वरित शुरुआत — न्यूनतम कार्यशील उदाहरण

एक फ़ाइल बनाएं config.yaml:

server:
  host: "localhost"
  port: 8080
debug: true

इसे yaml-cpp से पढ़ें:

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

int main() {
    // YAML फ़ाइल लोड करें
    YAML::Node config = YAML::LoadFile("config.yaml");
    
    // वैल्यू पढ़ें
    std::string host = config["server"]["host"].as<std::string>();
    int port = config["server"]["port"].as<int>();
    bool debug = config["debug"].as<bool>();
    
    std::cout << "Host: " << host << "\n";
    std::cout << "Port: " << port << "\n";
    std::cout << "Debug: " << std::boolalpha << debug << "\n";
    
    return 0;
}

कंपाइल करें: g++ -std=c++17 main.cpp -lyaml-cpp -o app

4. मुख्य तरीके/फ़ंक्शन/क्लास

4.1. YAML::Node — नोड्स के साथ काम करने के लिए मुख्य क्लास

सिग्नेचर: class YAML::Node

विवरण: YAML डॉक्यूमेंट के किसी भी एलिमेंट को दर्शाता है: स्केलर, सीक्वेंस (ऐरे) या मैपिंग (डिक्शनरी)। यह इटरेशन, की/इंडेक्स द्वारा एक्सेस, और टाइप चेकिंग को सपोर्ट करता है।

YAML::Node node;
node["name"] = "Alice";
node["age"] = 30;
node["hobbies"].push_back("reading");
node["hobbies"].push_back("coding");

std::cout << node["name"].as<std::string>() << "\n"; // Alice
std::cout << node["hobbies"][0].as<std::string>() << "\n"; // reading

4.2. YAML::LoadFile() — फ़ाइल से लोड करना

सिग्नेचर: YAML::Node YAML::LoadFile(const std::string& filename)

विवरण: किसी YAML फ़ाइल को पढ़कर एक YAML::Node ऑब्जेक्ट में बदलता है। अगर फ़ाइल मौजूद नहीं है या फ़ॉर्मेट गलत है तो यह एक अपवाद (exception) फेंकता है।

try {
    YAML::Node config = YAML::LoadFile("settings.yaml");
    // कॉन्फ़िगरेशन का उपयोग करें
} catch (const YAML::Exception& e) {
    std::cerr << "YAML त्रुटि: " << e.what() << "\n";
}

4.3. YAML::Load() — स्ट्रिंग से लोड करना

सिग्नेचर: YAML::Node YAML::Load(const std::string& input)

विवरण: YAML डेटा को सीधे एक स्ट्रिंग से पार्स करता है। यह तब उपयोगी है जब YAML डेटा नेटवर्क से या उपयोगकर्ता इनपुट से आता है।

std::string yaml_data = "name: Bob\nage: 25";
YAML::Node person = YAML::Load(yaml_data);
std::cout << person["name"].as<std::string>() << "\n"; // Bob

4.4. YAML::Emitter — YAML आउटपुट जनरेट करना

सिग्नेचर: class YAML::Emitter

विवरण: C++ डेटा से YAML फ़ॉर्मेटेड स्ट्रिंग बनाने के लिए उपयोग किया जाता है। यह स्ट्रीम ऑपरेटर (<<) को सपोर्ट करता है और स्वचालित रूप से इंडेंटेशन और फ़ॉर्मेटिंग को संभालता है।

YAML::Emitter out;
out << YAML::BeginMap;
out << YAML::Key << "name";
out << YAML::Value << "Charlie";
out << YAML::Key << "skills";
out << YAML::Value << YAML::BeginSeq;
out << "C++" << "Python" << "YAML";
out << YAML::EndSeq;
out << YAML::EndMap;

std::cout << out.c_str() << "\n";
// आउटपुट:
// name: Charlie
// skills:
//   - C++
//   - Python
//   - YAML

4.5. नोड टाइप चेकिंग और कन्वर्ज़न

सिग्नेचर: YAML::NodeType::value (Scalar, Sequence, Map, Null, Undefined)

विवरण: किसी नोड के टाइप की जांच करने और उसे विभिन्न C++ प्रकारों में बदलने के लिए तरीके। IsScalar(), IsSequence(), IsMap(), और as<T>() का उपयोग करें।

YAML::Node data = YAML::Load("[1, 2, 3]");
if (data.IsSequence()) {
    for (std::size_t i = 0; i < data.size(); ++i) {
        std::cout << data[i].as<int>() << " ";
    }
}
// आउटपुट: 1 2 3

5. उन्नत उदाहरण — कस्टम स्ट्रक्चर के साथ काम करना

मान लीजिए आपके पास एक C++ स्ट्रक्चर है जिसे आप YAML से भरना चाहते हैं:

struct Person {
    std::string name;
    int age;
    std::vector<std::string> hobbies;
};

// YAML नोड से Person स्ट्रक्चर में बदलने के लिए फ़ंक्शन
Person parsePerson(const YAML::Node& node) {
    Person p;
    p.name = node["name"].as<std::string>();
    p.age = node["age"].as<int>();
    
    if (node["hobbies"] && node["hobbies"].IsSequence()) {
        for (const auto& hobby : node["hobbies"]) {
            p.hobbies.push_back(hobby.as<std::string>());
        }
    }
    return p;
}

// उपयोग
YAML::Node personNode = YAML::Load("name: David\nage: 28\nhobbies: [swimming, hiking]");
Person david = parsePerson(personNode);
std::cout << david.name << " की उम्र " << david.age << " है\n";

6. सामान्य समस्याएं और समाधान

समस्या: फ़ाइल नहीं मिली या पार्सिंग त्रुटि

समाधान: हमेशा YAML::LoadFile() या YAML::Load() को try-catch ब्लॉक में रखें। YAML::Exception को पकड़ें और त्रुटि संदेश प्रिंट करें।

समस्या: गलत टाइप कन्वर्ज़न (जैसे स्ट्रिंग को int में बदलना)

समाधान: as<T>() का उपयोग करने से पहले IsScalar() से जांच करें, या try-catch का उपयोग करें। आप as<T>(default_value) का उपयोग करके डिफ़ॉल्ट वैल्यू भी दे सकते हैं।

समस्या: बड़ी फ़ाइलों में धीमी पार्सिंग

समाधान: yaml-cpp पूरी फ़ाइल को मेमोरी में लोड करता है। बहुत बड़ी फ़ाइलों के लिए, फ़ाइल को छोटे भागों में विभाजित करने पर विचार करें या स्ट्रीमिंग पार्सर का उपयोग करें (यदि उपलब्ध हो)।

7. निष्कर्ष

yaml-cpp C++ डेवलपर्स के लिए YAML के साथ काम करने का सबसे अच्छा तरीका है। यह सरल, शक्तिशाली और अच्छी तरह से डॉक्यूमेंटेड है। चाहे आप कॉन्फ़िगरेशन फ़ाइलें पढ़ रहे हों, डेटा सीरियलाइज़ कर रहे हों, या CI/CD पाइपलाइनों के साथ काम कर रहे हों, yaml-cpp आपकी ज़रूरतों को पूरा करेगा।

अधिक जानकारी के लिए, आधिकारिक GitHub रिपॉजिटरी और दस्तावेज़ देखें। हैप्पी कोडिंग!

अनुशंसाएँ