【问题标题】:Outputting more things than a Polymorphic Text Archive输出比多态文本档案更多的东西
【发布时间】:2015-02-09 22:04:09
【问题描述】:

我正在使用Shark 机器学习库,它使用boost::archive::polymorphic_text_(io)archive 类将其分类器输出到文件中。

我正在创建一个词袋模型,我还需要将其写入文件(使用我自己的代码),并且还需要将其输出到文件中。

理想情况下,我希望将其输出到与分类器相同的文件中。是否可以将内容写入与使用多态文本存档时相同的文件?在存档开始时仅通过 fstream 就足够了吗?

编辑:稍微清楚一点:Boost 是否支持我将其他东西放在这些档案旁边的文件中?

【问题讨论】:

    标签: c++ c++11 boost


    【解决方案1】:

    首发:Streams Are Not Archives

    我的第一反应是“你试过了吗”。但是,我很感兴趣,在文档中找不到任何关于此的内容,所以我自己做了一些测试:

    • 答案似乎是“否”,不支持
    • 它似乎适用于二进制存档
    • 它似乎崩溃了,因为 xml/文本档案在输入缓冲区中留下了尾随的 0xa 字符。如果要读取的“下一个”存档也是文本,则这些不会造成问题,但显然会破坏二进制存档。

    这是我的测试仪:

    Live On Coliru

    #include <boost/archive/binary_iarchive.hpp>
    #include <boost/archive/text_iarchive.hpp>
    #include <boost/archive/xml_iarchive.hpp>
    #include <boost/archive/binary_oarchive.hpp>
    #include <boost/archive/text_oarchive.hpp>
    #include <boost/archive/xml_oarchive.hpp>
    
    int data = 42;
    
    template <typename Ar>
    void some_output(std::ostream& os)
    {
        std::cout << "Writing archive at " << os.tellp() << "\n";
        Ar ar(os);
        ar << BOOST_SERIALIZATION_NVP(data);
    }
    
    template <typename Ar>
    void roundtrip(std::istream& is)
    {
        data = -1;
        std::cout << "Reading archive at " << is.tellg() << "\n";
        Ar ar(is);
        ar >> BOOST_SERIALIZATION_NVP(data);
        assert(data == 42);
    }
    
    #include <sstream>
    
    int main()
    {
        std::stringstream ss;
    
        //some_output<boost::archive::text_oarchive>(ss); // this derails the binary archive that follows
        some_output<boost::archive::binary_oarchive>(ss);
        some_output<boost::archive::xml_oarchive>(ss);
        some_output<boost::archive::text_oarchive>(ss);
    
        //roundtrip<boost::archive::text_iarchive>(ss);
        roundtrip<boost::archive::binary_iarchive>(ss);
        roundtrip<boost::archive::xml_iarchive>(ss);
        roundtrip<boost::archive::text_iarchive>(ss);
    
        // just to prove that there's remaining whitespace
        std::cout << "remaining: ";
        char ch;
        while (ss>>std::noskipws>>ch)
            std::cout << " " << std::showbase << std::hex << ((int)(ch));
        std::cout << "\n";
    
        // of course, anything else will fail:
        try {
            roundtrip<boost::archive::text_iarchive>(ss);
        } catch(boost::archive::archive_exception const& e)
        {
            std::cout << "Can't deserialize from a stream a EOF: " << e.what();
        }
    }
    

    打印:

    Writing archive at 0
    Writing archive at 44
    Writing archive at 242
    Reading archive at 0
    Reading archive at 44
    Reading archive at 240
    remaining:  0xa
    Reading archive at 0xffffffffffffffff
    Can't deserialize from a stream a EOF: input stream error
    

    【讨论】:

    • 谢谢,很好的回答!我还没来得及测试它,但我找不到任何关于它如何存储在文件中的真实文档,所以我不太确定如何测试它。此外,以前从未听说过 Coliru,它似乎是一个不错的工具。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    • 2010-10-05
    • 2012-04-15
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    相关资源
    最近更新 更多