0

我正在使用解析器来解析网格文件(已转换为字符串)以制作简单的 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

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

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

任何帮助表示赞赏,谢谢!

4

1 回答 1

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;
    }
}

希望这可以帮助。

于 2013-02-02T20:27:26.083 回答