【问题标题】:Tokenize a string using stringstream starting from a specified position or label使用 stringstream 从指定位置或标签开始标记字符串
【发布时间】:2013-01-17 22:13:44
【问题描述】:

我正在使用解析器来解析网格文件(已转换为字符串)以制作简单的 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 (或可能的其他字符串函数)来做到这一点?我有更多使用字符串函数的经验,但由于空格和数字的长度不同,我遇到了这些问题。

感谢任何帮助,谢谢!

【问题讨论】:

标签: c++ string parsing stringstream


【解决方案1】:

如果我正确理解您想要实现的目标,那么是的,您可以使用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;
    }
}

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多