我正在尝试创建一个简单的解析器和一个小文本文件,它遵循以下结构:
Variable_name = Value;
VARIABLE_2 = SECOND_VALUE;
找到有效的方法,但使用很多图书馆,如Boost。我想知道你是否可以做一个简单,最好只有 STD 的图书馆。
谢谢,Bruno Alano。
答案 0 :(得分:3)
如果变量和值不能包含等号或分号,并且您可以假设文件总是格式良好,那么这很简单。
抓住所有内容,直到你达到分号。将字符串拆分为=
符号。第一部分是您的变量名称。第二部分是价值。
如果您必须处理评论,字符串文字值(可能包含=
或;
)这是非繁体,您应该使用{{1} }。
如果您想知道如何分割字符串,那么就该主题提出了许多问题,其中一个特别好的问题是:Split a string in C++?
答案 1 :(得分:3)
如果您的格式将保持原样,并且变量名称或值中没有空格,则可以使用std::string
和std::istringstream
的组合轻松完成此操作。您可以简单地执行以下操作:
//assume we have an open ifstream object called in_file to your file
string line;
getline(in_file, line);
while (in_file.good())
{
char variable[100];
char value[100];
char equals;
//get rid of the semi-colon at the end of the line
string temp_line = line.substr(0, line.find_last_of(";"));
istringstream split_line(temp_line);
//make sure to set the maximum width to prevent buffer overflows
split_line >> setw(100) >> variable >> equals >> value;
//do something with the string data in your buffers
getline(in_file, line);
}
您可以更改variable
和value
的类型以正确满足您的需求......它们不需要是char
个缓冲区,但可以是任何其他类型的缓冲区为您要使用的数据类型定义了istream& operator>>(istream&, type&)
。
答案 2 :(得分:1)
它基本上与INI文件不同。
快速搜索出现: http://code.google.com/p/inih/
哪个具有最小的依赖性。
如果需要,可能很容易删除部分处理。
您需要添加分号处理,这通常是INI文件中注释的开始。
至少是一个起点。
答案 3 :(得分:1)
您可以使用lemon parser generator,它会在stdlibc旁边生成一个没有依赖项的文件。 Here是一个很好的入门教程。
作为扫描仪,我更喜欢re2c,这也是公共领域。
如果你真的需要C ++,你可以将yyparse()
函数包装在C ++类中。
答案 4 :(得分:1)
真正的简短(C风格)方法类似于:
scanf("%s = %[^\n]", variable_name, value);