在C/C++中解析配置文件

9 c++

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

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

[CategoryA]

[SubCat]

    Str1 = Test 

    Str2 = Description  

[SubCat] [End]

[SubCat]

    Str1 = Othertest
...

[CategoryA] [End]
Run Code Online (Sandbox Code Playgroud)

有什么建议?

Mar*_*off 14

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

至少有一些INI解析器库:例如minIni,iniParser,libini.


sbi*_*sbi 13

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

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

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

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");
}
Run Code Online (Sandbox Code Playgroud)

对于实际的解析,您可以1)先查看第一个字符.如果是a [,则从流中弹出它,并用于std::getline(is,identifier,']')读取'['和']'中的任何内容.如果不是a [,则使用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. (2认同)

Ada*_*ura 9

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

[CategoryA]
Option = Data

[CategoryB.Subcategory1]
Option = Data

[CategoryB.Subcategory2]
Option = Data
Run Code Online (Sandbox Code Playgroud)

它还有一些其他功能,所以它实际上是非常有用的IMO.