使用stringstream从指定的位置或标签开始对字符串进行标记

时间:2013-02-02 20:06:21

标签: c++ string parsing stringstream

我正在使用解析器来解析网格文件(已经转换为字符串)以生成简单的2D图形。下面是一个如何格式化文件的例子(有这样的多个网格构成文件):

# left ladder pole
begin_mesh
dimension   2 2
begin_vertices
-0.3  0.85
-0.2  0.85
-0.3 -0.85
-0.2 -0.85
end_vertices
end_mesh

'#'表示注释行的开头,您可以看到显示x和y值开头的begin_mesh和begin_vertices关键字。

所以基本上我想解析和标记化'begin_vertices'和'end_vertices'之间的空格之间的顶点x和y值(数字)。有没有办法使用stringstream(或可能是其他字符串函数)来做到这一点?我有更多使用字符串函数的经验,但由于空格和数字的长度不同,我遇到了麻烦。

感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

如果我正确理解了您想要实现的目标,那么您可以使用istringstream从文件中读取字符串中的输入。以下程序显示了如何解析您提供的输入:

#include <vector>
#include <string>
#include <sstream>
#include <iostream>

using namespace std;

struct point
{
    double x = 0;
    double y = 0;
    friend istream& operator >> (istream& is, point& p)
    {
        is >> p.x;
        is >> p.y;
        return is;
    }
};

template<typename InputStream>
void parse_vertices(InputStream& is, vector<point>& v)
{
    point p;
    while (is >> p)
    {
        v.push_back(p);
    }
}

上述函数是通用的,这意味着它对字符串流或文件流同样有效。假设您想要从字符串中读取输入,这就是您调用它的方式:

int main()
{
    string s =
        R"(-0.3  0.85
        -0.2  0.85
        -0.3 -0.85
        -0.2 -0.85
        )";

    istringstream is(s);

    vector<point> vertices;
    parse_vertices(is, vertices);

    for (point const& p : vertices)
    {
        cout << p.x << " " << p.y << endl;
    }
}

希望这有帮助。