4

我正在尝试创建一个简单的解析器和一个遵循以下结构的小文本文件:

变量名 = 值;

VARIABLE_2 = SECOND_VALUE;

但是,找到的有效方法使用了许多库,例如 Boost。我想知道您是否可以制作一个简单的,最好只使用STD的库。

谢谢,布鲁诺阿拉诺。

4

5 回答 5

3

如果变量和值不能包含等号或分号,并且您可以假设文件将始终是格式正确的,那么这很容易做到。

抓住一切,直到你到达一个分号。=在符号处拆分字符串。第一部分是你的变量名。第二部分是价值。

如果您必须处理注释,字符串文字值(可能包含=;)这是非平凡的,您应该使用boost.Spirit.

如果您想知道如何拆分字符串,有很多关于该主题的问题,其中一个特别好的问题是:在 C++ 中拆分字符串?

于 2011-08-11T18:25:18.110 回答
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);
}

您可以更改 和 的类型variablevalue正确满足您的需求......它们不需要是char缓冲区,但可以是istream& operator>>(istream&, type&)为您要使用的数据类型定义的任何其他类型。

于 2011-08-11T18:41:56.230 回答
1

它基本上与 INI 文件没有什么不同。

快速搜索出现了这个: http ://code.google.com/p/inih/

它具有最小的依赖关系。

如果需要,很容易去掉部分处理。

不过,您需要添加对分号的处理,这通常是 INI 文件中注释的开头。

至少,它是一个起点。

于 2011-08-11T18:33:33.303 回答
1

您可以使用柠檬解析器生成器,它会生成一个除了 stdlibc 之外没有依赖关系的文件。是一个很好的入门教程。

作为扫描仪,我更喜欢re2c,这也是公共领域。

如果您真的需要 C++,可以将函数包装yyparse()在 C++ 类中。

于 2011-08-11T18:51:28.007 回答
1

真正简短(C 风格)的方法类似于:

scanf("%s = %[^\n]", variable_name, value);
于 2011-08-11T18:58:21.070 回答