在管道中调用时,从 std::cin 加载 pugi::xml_document 失败

Loading pugi::xml_document from std::cin fails when invoked in pipeline

本文关键字:加载 cin pugi 失败 document xml std 管道 调用      更新时间:2023-10-16

Using pugixml 1.0

当我使用 shell STDIN 重定向时,从 std::cin 加载 XML 文档有效:

$ ./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;
}

我不明白原因。

>pugixml 1.0 期望输入流是可搜索的。如果流绑定到文件,则查找有效,但如果流绑定到管道,则查找将失败。

从 pugixml 1.2 开始(已发布...昨天:)),不可搜索的流被接受为 load() 源。您的示例在使用 1.2 进行编译时有效。