首页 >后端开发 >C++ >如何使用 C 获取找到特定选项或部分的 INI 文件的行号?

如何使用 C 获取找到特定选项或部分的 INI 文件的行号?

Linda Hamilton
Linda Hamilton原创
2024-10-25 23:04:28346浏览

How can I get the line number of an INI file where a specific option or section is found using C  ?

获取找到给定选项的 INI 文件行号的跨平台方法

问题:

寻找一个 C 库(如 boost::program_options),它可以返回找到给定选项或部分的 INI 文件的行号。

用例:

  1. 要求库在“[SSS]”部分中查找值“vvv”。库应返回在“[SSS]”部分中找到“vvv”的行号或-1。例如,这允许我们说“第 55 行:vvv 必须
  2. 迭代 INI 文件中的部分并验证它们的名称。当发现未知部分时,我们可以报告“第 55 行:部分[哈哈哈]未知。”

响应:

利用 Boost 的可能性Spirit,使用 line_pos_iterator 制定了解决方案。

实现细节:

  • POSITIONSINFO = 0:

    • 输入是流式传输。
    • 输出是原始字符串格式,或map>>对于部分。
  • POSITIONSINFO = 1:

    • 输入已缓冲。
    • 输出位于textnode_t 格式:
    <code class="cpp">struct textnode_t {
      int sline, eline, scol, ecol;
      string_t text;
    };</code>
    • 这使得生成的地图>报告各个文本元素的确切行和列的起始点和结束点。
    • 注释(#, / ... / 样式)已实现。
    • 空格是可以容忍。
    • 斜线转义留作练习。
    • 启用后会报告错误并提供完整的位置信息。

代码片段:

<code class="cpp">#include <map>
#include <string>
#include <iterator>
#include <boost/tuple/tuple_comparison.hpp>

template <typename S = std::string, typename Cmp = std::less<S>>
class IniFile {
public:
    IniFile(Cmp cmp = Cmp()) : _cmp(cmp) {}

    IniFile(const std::string& filename, Cmp cmp = Cmp()) : _cmp(cmp) { open(filename); }

    void open(const std::string& filename);

typedef S string_t;
#if POSITIONINFO
    struct textnode_t {
        int sline, eline,
            scol, ecol;
        string_t text;

        // ...
    };
#else
    typedef string_t textnode_t;
#endif

typedef std::pair<textnode_t, textnode_t> keyvalue_t;
typedef std::map<textnode_t, textnode_t> section_t;
typedef std::map<textnode_t, section_t> sections_t;

private:
    Cmp _cmp;
};</code>

其他资源:

  • [包含完整代码、makefile 和 example.ini 的要点]( https://gist.github.com/1425972)
  • [Boost Spirit 文档](https://www.boost.org/doc/libs/1_65_1/libs/spirit/doc/)

重要提示:提供的解决方案不需要 C 11 支持,但它用于转储解析结果。

以上是如何使用 C 获取找到特定选项或部分的 INI 文件的行号?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn