1. ホーム
  2. c++

[解決済み] C++による簡単な文字列のパース

2022-03-11 11:16:56

質問

C++を使い始めてからかなり経ちますが、それにも関わらず scanf 簡単なテキストファイルをパースしなければならないとき。たとえば、次のような構成があるとします(フィールドの順序が異なる可能性も想定しています)。

foo: [3 4 5]
baz: 3.0

というようなことを書きます。

char line[SOME_SIZE];
while (fgets(line, SOME_SIZE, file)) {
    int x, y, z;
    if (3 == sscanf(line, "foo: [%d %d %d]", &x, &y, &z)) {
        continue;
    }
    float w;
    if (1 == sscanf(line, "baz: %f", &w)) {
        continue;
    }
}

C++でこれを実現する最も簡潔な方法は何でしょうか?私が試したときはいつも、たくさんの足場となるコードで終わってしまいます。

どうすれば解決するの?

標準C++のみでのトライです。

ほとんどの場合、私はstd::istringstreamとstd::getline(単語の区切りに効果がある)の組み合わせで、欲しいものを得るために使っています。そして、もし可能なら、私は自分の設定ファイルを次のようなものにする。

foo=1,2,3,4

というように、簡単になります。

テキストファイルはこんな感じです。

foo=1,2,3,4
bar=0


そして、このようにパースするのです。

int main()
{
    std::ifstream file( "sample.txt" );

    std::string line;
    while( std::getline( file, line ) )   
    {
        std::istringstream iss( line );

        std::string result;
        if( std::getline( iss, result , '=') )
        {
            if( result == "foo" )
            {
                std::string token;
                while( std::getline( iss, token, ',' ) )
                {
                    std::cout << token << std::endl;
                }
            }
            if( result == "bar" )
            {
               //...
    }
}