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

「#」はコメント行の開始を示し、x 値と y 値の開始を示す begin_mesh キーワードと begin_vertices キーワードを確認できます。

したがって、基本的には、「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 に答える