9 c++
我是一个新手,正在寻找一种快速简便的方法来解析C或C++中的文本文件(wxWidgets)
该文件看起来像这样(带有"子对象"的主要类别),它将出现在列表框中
[CategoryA]
[SubCat]
Str1 = Test
Str2 = Description
[SubCat] [End]
[SubCat]
Str1 = Othertest
...
[CategoryA] [End]
Run Code Online (Sandbox Code Playgroud)
有什么建议?
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.
您可能想尝试Boost.Program_Options.但它的格式略有不同.更接近INI文件.子类别是这样完成的:
[CategoryA]
Option = Data
[CategoryB.Subcategory1]
Option = Data
[CategoryB.Subcategory2]
Option = Data
Run Code Online (Sandbox Code Playgroud)
它还有一些其他功能,所以它实际上是非常有用的IMO.