我是一个新手,正在寻找一种快速简便的方法来解析C或C ++中的文本文件(wxWidgets)
该文件看起来像这样(带有“子对象”的主要类别),它将出现在列表框中
[CategoryA]
[SubCat]
Str1 = Test
Str2 = Description
[SubCat] [End]
[SubCat]
Str1 = Othertest
...
[CategoryA] [End]
有什么建议吗?
答案 0 :(得分:14)
答案 1 :(得分:13)
如果使用流,为此编写自己的解析器应该相当容易。您可以使用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。
答案 2 :(得分:9)
您可以尝试Boost.Program_Options。但它的格式略有不同。更接近INI文件。子类别是这样完成的:
[CategoryA]
Option = Data
[CategoryB.Subcategory1]
Option = Data
[CategoryB.Subcategory2]
Option = Data
它还有一些其他功能,所以它实际上非常有用的IMO。
答案 3 :(得分:3)
尝试配置器。它是易于使用且灵活的C ++库,用于配置文件解析(从最简单的INI到具有任意嵌套和语义检查的复杂文件)。仅限标题和跨平台。使用Boost C ++库。
答案 4 :(得分:1)
实现自己的解析器看起来比尝试调整您不熟悉的现有解析器更直接。
您的结构似乎 - 从您的示例 - 基于行。这使得解析变得容易。
将文件加载到树中,然后根据需要随意移动它通常是有意义的。
答案 5 :(得分:1)
仅在Windows上,GetPrivateProfileSection
执行此操作。它被弃用以支持注册表,但它仍然在这里,它仍然有效。
答案 6 :(得分:0)
尝试制作简单的XML文件怎么样?有很多图书馆可以帮助你阅读它,而且额外的好处是许多其他程序/语言也可以阅读它。
答案 7 :(得分:0)
如果您正在使用wxWidgets,我会考虑wxFileConfig。我没有使用wxWidgets,但该类似乎支持具有子类别的类别。