简单解析器的简单方法
Simple Method to a Simple Parser
我试图创建一个简单的解析器和一个小文本文件,遵循以下结构:
Variable_name = Value;
VARIABLE_2 = SECOND_VALUE;
找到了工作的方法,然而,使用许多库,如Boost。我想知道您是否可以使简单,最好只有STD的库。
谢谢你,Bruno Alano。
如果您的格式将保持您所列出的格式,并且在变量名或值中没有空格,则可以轻松地使用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&)
是为您想要使用的数据类型定义的。
如果变量和值不能包含等号或分号,并且您可以假设文件总是格式良好,那么这样做是微不足道的。
抓住所有东西,直到到达分号。在=
符号处拆分字符串。第一部分是变量名。第二部分是值。
如果你必须处理注释,字符串文字值(可能包含=
或;
),这是 nontrivial ,你应该使用boost.Spirit
。
如果你想知道如何分割字符串,有很多关于这个主题的问题,其中一个特别好的问题是:在c++中分割字符串?
它基本上和INI文件没有什么不同。
快速搜索得到这样的结果:http://code.google.com/p/inih/
具有最小的依赖关系。
如果需要的话,去掉部分处理可能很容易。
您需要添加分号的处理,分号通常是INI文件中注释的开始。
真正简短的(c风格)方法应该是这样的:
scanf("%s = %[^n]", variable_name, value);
您可以使用lemon解析器生成器,它生成一个除了stdlibc之外没有任何依赖项的文件。这是一个很好的入门教程。
作为一个扫描器,我更喜欢re2c,它也是公共领域。
如果你真的需要c++,你可以把yyparse()
函数包装在一个c++类中。
- 一种在C++中读取TXT配置文件的简单方法
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 在OSX上使用CMake将Adobe的XMP工具包构建为共享库的最简单方法是什么?
- 通过比较C++中的行在 txt 文件中搜索的最简单方法是什么?
- 将时间戳打印到流的最简单方法
- 在C++中创建文件夹选取器对话框的最简单方法是什么?
- C++ 将静态方法转换为简单方法
- 将一系列数字映射到 CPP 中的值的简单方法
- 引用基类模板的成员变量的简单方法
- 学习数据结构和算法的简单方法
- boost::variant - 对变体应用算术的最简单方法
- 创建可以遍历 std::map 值的通用模板迭代器的最简单方法是什么?
- 在C++中将算术类型转换为 std::array 的最简单方法<uint8_t>
- 使用新运算符C++创建多维数组的简单方法
- C++-将ASCII字符数组中可能的数值转换为字符的最简单方法
- OpenSSL模块化最大数据类型大小的简单方法
- 获取当前按键的简单方法
- 多个 if-else 测试的更简单方法
- 为具有多个参数的函数创建 SWIG 类型图的更简单方法?