【问题标题】:boost::Program_options How to support hash character in a value?boost::Program_options 如何在值中支持哈希字符?
【发布时间】:2015-08-10 13:45:35
【问题描述】:

我正在尝试在配置文件的值中包含井号 ('#')。

我的用例是一个音乐程序,其中的值给出了吉他乐谱的调音。因此,在值中支持“#”是强制性的,并且不支持任何解决方法,这与可以使用“b”模拟的单位不同。

我尝试了以下语法:

tuning.1=d#
tuning.1=d\#
tuning.1=d##

在所有这些情况下,键 tuning.1 接收值 d,这当然不是本意。

是否可以在键的值中使用井号?我似乎在 boost 文档或在线中找不到任何关于它的信息。还是我应该求助于编写自定义解析器?

【问题讨论】:

    标签: c++ hash escaping boost-program-options


    【解决方案1】:

    我认为您无法更改 boost::program_options 解析值的方式,因为文档 says 即 The # character introduces a comment that spans until the end of the line。

    但是,您可以在解析配置文件时使用来自boost::iostreams 的自定义过滤器将您的哈希字符转换为另一个哈希字符。请参阅有关 filter usage 和 input filters 的文档。这是我写的一个非常基本的,用@替换#:

    #include <boost/iostreams/filtering_stream.hpp>
    
    struct escape_hash_filter: public boost::iostreams::input_filter
    {
      template <typename Source>
      int get (Source& src)
      {
        int c = boost::iostreams::get (src);
        if ((c == EOF) or (c == boost::iostreams::WOULD_BLOCK))
          return c;
        return ((c == '#')? '@': c;
      }
    };
    

    使用示例:

    std::ifstream in {"example.cfg"};
    boost::iostreams::filtering_istream escaped_in;
    escaped_in.push (escape_hash_filter {});
    escaped_in.push (in);
    
    po::store (po::parse_config_file (escaped_in, desc), vm);
    

    【讨论】:

    • 您可能还想在# 中转换@,以便@ 符号可以用作注释字符。
    • @MSalters 真的!如果当前行的所有前面字符都是空格,则另一种可能性是不转换 #。
    • @piwi:它就像一个魅力。我已经修改了结构的代码以遵循您在评论中的建议,即仅在当前行的所有前面字符都是空格时进行转换。通过这样做,现有的配置文件保持不变,并且对代码的更改仅限于在阅读调整时考虑锐度。优秀。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    相关资源
    最近更新 更多