42

yaml ファイルをロードしてデータを解析する方法を示す簡単なチュートリアルが必要です。外国人スタイルは素晴らしいですが、何らかの形でデータを実際に表示するソリューションは役に立ちます。

これまでのところ、C の yaml-0.1.1 ソースで複数のテストを実行しましたが、エラーが発生したり、何も出力されなかったり、run-emitter.c の場合でした。yaml ファイルを読み取り、STDOUT に出力します。libyaml 関数/構造体を介してテキストを生成しません。エラーが発生した場合、ファイルが不良だったのかビルドが間違っていたのかわかりません (何も変更していません...) ファイルは yaml.org からコピーされました

誰でもチュートリアルを教えてもらえますか? (私は少なくとも 30 分間、関連性のあるものを読んでグーグルで検索しました)、または適切なチュートリアルまたは例があるライブラリの名前。おそらく、どの libyaml テストがファイルにロードされ、それに対して何かを実行するか、エラーが発生した理由を教えてください。このドキュメントでは、ファイルの使用方法については説明せず、ロード方法についてのみ説明します。

http://pyyaml.org/wiki/LibYAML#Documentation

4

5 に答える 5

66

C++ パーサーのyaml-cpp (この質問で提案されているように) を試してください。

開示:私は著者です。

構文例 (チュートリアルから):

YAML::Node config = YAML::LoadFile("config.yaml");

if (config["lastLogin"]) {
  std::cout << "Last logged in: " << config["lastLogin"].as<DateTime>() << "\n";
}

const std::string username = config["username"].as<std::string>();
const std::string password = config["password"].as<std::string>();
login(username, password);
config["lastLogin"] = getCurrentDateTime();

std::ofstream fout("config.yaml");
fout << config;
于 2009-05-08T06:02:10.683 に答える
11

http://wpsoftware.net/andrew/pages/libyaml.htmlにチュートリアルを書きました 。

これは、トークンベースおよびイベントベースの解析を使用して、C で libyaml を使用する基本をカバーしています。YAML ファイルの内容を出力するためのサンプル コードが含まれています。

于 2011-01-12T20:53:45.403 に答える
5

「yaml load lang:c++」の Google Code Search (現在は廃止) は、これを最初のリンクとして示しました: demo.cc :

#include <iyaml++.hh>
#include <tr1/memory>
#include <iostream>
#include <stdexcept>

using namespace std;

// What should libyaml++ do when a YAML entity is parsed?
// NOTE:  if any of the event handlers is not defined, a respective default
// no-op handler will be used.  For example, not defining on_eos() is
// equivalent to defining void on_eos() { }.
class my_handler : public yaml::event_handler {
    void on_string(const std::string& s) { cout << "parsed string:  " << s << endl; }
    void on_integer(const std::string& s) { cout << "parsed integer:  " << s << endl; }
    void on_sequence_begin() { cout << "parsed sequence-begin." << endl; }
    void on_mapping_begin() { cout << "parsed mapping-begin." << endl; }
    void on_sequence_end() { cout << "parsed sequence-end." << endl; }
    void on_mapping_end() { cout << "parsed mapping-end." << endl; }
    void on_document() { cout << "parsed document." << endl; }
    void on_pair() { cout << "parsed pair." << endl; }
    void on_eos() { cout << "parsed eos." << endl; }
};

// ok then, now that i know how to behave on each YAML entity encountered, just
// give me a stream to parse!
int main(int argc, char* argv[])
{
    tr1::shared_ptr<my_handler> handler(new my_handler());
    while( cin ) {
        try { yaml::load(cin, handler); } // throws on syntax error

        catch( const runtime_error& e ) {
            cerr << e.what() << endl;
        }
    }
    return 0;
}
于 2008-12-13T13:50:18.767 に答える