3

こんにちは、文字列から「/」とスペースで区切られた複数のフロートを解析する方法をお聞きしたいと思います。

ファイルのテキスト形式は「f1/1/1 2/2/23/3/34/4/4」です。このテキスト行のすべての整数をいくつかのint変数に解析して使用する必要があります。 「顔」オブジェクトを作成します(以下を参照)。

int a(0),b(0),c(0),d(0),e(0);
int t[4]={0,0,0,0};
//parsing code goes here
faces.push_back(new face(b,a,c,d,e,t[0],t[1],t[2],t[3],currentMaterial));

sscanf()でそれを行うことはできましたが、大学の講師から警告を受けていたので、別の方法を探しています。ブーストを含む他のサードパーティライブラリも許可されていません。

正規表現とstringstream()を使用した構文解析について言及されていますが、どちらについてもよくわかりません。アドバイスをいただければ幸いです。

4

4 に答える 4

1

std :: ifstreamを使用してファイルを読み取っている場合、そもそもstd :: istringstreamは必要ありません(ただし、2つを使用することは、同じ基本クラスから継承するため、非常に似ています)。std :: ifstreamでそれを行う方法は次のとおりです:

ifstream ifs("Your file.txt");
vector<int> numbers;

while (ifs)
{
    while (ifs.peek() == ' ' || ifs.peek() == '/')
        ifs.get();

    int number;
    if (ifs >> number)
        numbers.push_back(number);
}
于 2012-09-19T19:02:29.697 に答える
1

あなたの例を考慮に入れると、f 1/1/1 2/2/2 3/3/3 4/4/4あなたが読む必要があるものは次のとおりです。char int char int char int int char int char int int char int char int

これをする:

istringstream is(str);

char f, c;
int d[12];

bool success = (is >> f) && (f == 'f') 
            && (is >> d[0])  && (is >> c) && (c == '/') 
            && (is >> d[1])  && (is >> c) && (c == '/') && 
            .....  && (is >> d[11]);
于 2012-09-19T19:05:22.033 に答える
1

これを行う方法は、スペースの解釈を変更して、他の区切り文字を含めることです。気になる場合は、それぞれが1つのセパレーターを処理するように設定されたファセットを持つさまざまなstd::ostreamオブジェクトを使用し、共有を使用します。std::ctype<char>std::streambuf

セパレーターを明示的に使用したい場合は、代わりに適切なマニピュレーターを使用してセパレーターをスキップするか、セパレーターがない場合は失敗を示します。

template <char Sep>
std::istream& sep(std::istream& in) {
    if ((in >> std::ws).peek() != std::to_int_type(Sep)) {
        in.setstate(std::ios_base::failbit);
    }
    else {
        in.ignore();
    }
    return in;
}

std::istream& (* const slash)(std::istream&) = Sep<'/'>;

コードはテストされておらず、モバイルデバイスで入力されていません。つまり、小さなエラーが含まれている可能性があります。次のようなデータを読み取ります。

if (in >> v1 >> v2 >> slash >> v3 /*...*/) {
  deal_with_input(v1, v2, v3);
}

注:上記の使用は、入力を次のように想定しています。

1.0 2.0/3.0

つまり、最初の値の後にスペースがあり、2番目の値の後にスラッシュがあります。

于 2012-09-19T19:12:52.763 に答える
0

boost::splitを使用できます。

サンプル例は次のとおりです。

string line("test\ttest2\ttest3");
vector<string> strs;
boost::split(strs,line,boost::is_any_of("\t"));

cout << "* size of the vector: " << strs.size() << endl;    
for (size_t i = 0; i < strs.size(); i++)
    cout << strs[i] << endl;

詳細はこちら:

http://www.boost.org/doc/libs/1_51_0/doc/html/string_algo.html

および関連:

boost :: alarmithm::splitを使用して文字列を分割する

于 2012-09-19T18:48:06.847 に答える