【问题标题】:Parse config file in C/C++在 C/C++ 中解析配置文件
【发布时间】:2009-09-13 13:35:51
【问题描述】:

我是一个新手,正在寻找一种快速简便的方法来解析 C 或 C++ (wxWidgets) 中的文本文件

文件看起来像这样(带有“子对象”的主类别),将出现在列表框中

[CategoryA]

[SubCat]

    Str1 = Test 

    Str2 = Description  

[SubCat] [End]

[SubCat]

    Str1 = Othertest
...

[CategoryA] [End]

有什么建议吗?

【问题讨论】:

标签: c++


【解决方案1】:

听起来你想解析一个非常接近 ini 文件的文件。

至少有几个 INI 解析器库:例如minIniiniParserlibini

【讨论】:

    【解决方案2】:

    如果您使用流,则为此编写自己的解析器应该相当容易。您可以使用std::ifstream 读取文件:

    std::ifstream ifs("filename.ext");
    if(!ifs.good()) throw my_exceptions("cannot open file");
    read_file(ifs);
    

    因为它看起来是面向行的,所以你会先读取行,然后处理这些:

    void read_file(std::istream& is) 
    {
      for(;;) {
        std::string line;
        std::getline(is, line);
        if(!is) break;
        std::istringstream iss(line);
        // read from iss 
      }
      if(!is.eof()) throw my_exceptions("error reading file");
    }
    

    对于实际的解析,您可以1) 首先查看第一个字符。如果那是[,将其从流中弹出,并使用std::getline(is,identifier,']') 读取'[' 和']' 中的任何内容。如果不是[,则使用std::getline(is, key, '=') 读取键值对的左侧,然后使用std::getline(is, value) 读取右侧。

    注意:不幸的是,流输入通常并不快如闪电。 (不一定要那样,但在实践中经常是这样。)然而,一旦你知道很少的模式来处理它的特性,它真的很容易做到,而且很容易做到正确(比如if(strm.good())if(strm) 不同,也不是if(strm.bad()) 的对立面,还有一些你必须习惯的东西)。对于像从磁盘读取 ini 文件这样对性能至关重要(har har!)的事情,在 1,000,000 个案例中的 999,999 个案例中,它应该足够快。

    【讨论】:

    • 三年后,但答案非常丰富。我对文件流很陌生,您提供了制作基本解析器所需的所有信息,而无需任何其他库(大多数情况下,我喜欢整个 getline 参数来获取特定字符之间的字符串)。我希望我能给多个 +1。
    【解决方案3】:

    您可能想试试Boost.Program_Options。但是它的格式略有不同。更接近 INI 文件。子类别是这样完成的:

    [CategoryA]
    Option = Data
    
    [CategoryB.Subcategory1]
    Option = Data
    
    [CategoryB.Subcategory2]
    Option = Data
    

    它还有一些其他功能,所以它实际上对 IMO 非常有用。

    【讨论】:

      【解决方案4】:

      试试配置器。它是易于使用且灵活的 C++ 库,用于配置文件解析(从最简单的 INI 到具有任意嵌套和语义检查的复杂文件)。仅标题和跨平台。使用 Boost C++ 库。

      见:http://opensource.dshevchenko.biz/configurator

      【讨论】:

        【解决方案5】:

        实现您自己的解析器看起来比尝试调整您不熟悉的现有解析器更简单。

        从您的示例来看,您的结构似乎是基于行的。这使得解析变得容易。

        通常将文件加载到树中,然后根据需要在树中四处走动是有意义的。

        【讨论】:

          【解决方案6】:

          仅在 Windows 上,GetPrivateProfileSection 执行此操作。它已被弃用,取而代之的是注册表,但它仍然存在并且仍然有效。

          【讨论】:

            【解决方案7】:

            尝试制作一个简单的 XML 文件怎么样?有很多库可以帮助您阅读它,另外还有很多其他程序/语言也可以阅读它。

            【讨论】:

            • 我发现不一定是解析的开销,而是将 xml 文件绑定到数据的开销不值得为简单的配置文件付出努力。如果您有创建绑定的东西,那就另当别论了。
            【解决方案8】:

            如果您使用 wxWidgets,我会考虑使用wxFileConfig。我没有使用 wxWidgets,但该类似乎支持带有子类别的类别。

            【讨论】:

              猜你喜欢
              • 2017-11-17
              • 2016-03-30
              • 1970-01-01
              • 1970-01-01
              • 2023-03-24
              • 1970-01-01
              • 2011-12-31
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多