2

pugixml1.0を使用する

std :: cinからのXMLドキュメントのロードは、シェルSTDINリダイレクトを使用すると機能します。

$ ./pugitest < sample.xml # OK

しかし、パイプラインで呼び出されると、失敗します。

$ cat sample.xml | ./pugitest # FAILS
./pugitest: Error reading from file/stream

これは、pugitestプログラムのコードです。

#include "pugixml.hpp"

#include <iostream>
#include <stdexcept>

int main(int argc, char *const argv[])
{
    try {
        pugi::xml_document doc;
        pugi::xml_parse_result result = doc.load(std::cin);
        if (!result) {
            throw std::runtime_error(result.description());
        }
    } catch (std::exception& e) {
        std::cerr << argv[0] << ": " << e.what() << '\n';
        return 1;
    }

    return 0;
}

理由がわかりません。

4

1 に答える 1

2

pugixml 1.0は、入力ストリームがシーク可能であることを想定しています。シークは、ストリームがファイルにバインドされている場合は機能しますが、ストリームがパイプにバインドされている場合は失敗します。

pugixml 1.2(リリースされました...昨日:))以降、シークできないストリームはload()ソースとして受け入れられます。サンプルは、1.2を使用してコンパイルすると機能します。

于 2012-05-03T05:26:48.610 に答える