4

次の構造に従う単純なパーサーと小さなテキスト ファイルを作成しようとしています。

変数名 = 値;

VARIABLE_2 = SECOND_VALUE;

ただし、機能するメソッドが見つかった場合は、Boost などの多くのライブラリを使用しますできればSTDのライブラリだけで簡単に作成できるのだろうか。

ありがとう、ブルーノ・アラノ。

4

5 に答える 5

3

変数と値に等号またはセミコロンを含めることができず、ファイルが常に整形式であると想定できる場合、これは簡単です。

セミコロンに到達するまですべてをつかみます。=記号で文字列を分割します。最初の部分は変数名です。2番目の部分は値です。

コメント、文字列リテラル値(=またはを含む場合があります;)を処理する必要がある場合、これは重要であり、を使用する必要がありますboost.Spirit

文字列を分割する方法がわからない場合は、このトピックについて多くの質問がありますが、特に良い質問は次のとおりです。C ++で文字列を分割しますか?

于 2011-08-11T18:25:18.110 に答える
3

あなたのフォーマットがあなたがリストしたままであり、変数名にも値にもスペースがない場合、これは と の組み合わせを使用して簡単に行うことができstd::stringますstd::istringstream. 次のように簡単に実行できます。

//assume we have an open ifstream object called in_file to your file
string line;
getline(in_file, line);

while (in_file.good())
{
    char variable[100];
    char value[100];
    char equals;

    //get rid of the semi-colon at the end of the line
    string temp_line = line.substr(0, line.find_last_of(";"));
    istringstream split_line(temp_line);

    //make sure to set the maximum width to prevent buffer overflows
    split_line >> setw(100) >> variable >> equals >> value;

    //do something with the string data in your buffers

    getline(in_file, line);
}

variableニーズに合わせてとの型を変更できます。バッファでvalueある必要はありませんが、使用するデータ型に対して定義されている他の型を指定できます。charistream& operator>>(istream&, type&)

于 2011-08-11T18:41:56.230 に答える
1

本当に短い (C スタイルの) メソッドは次のようになります。

scanf("%s = %[^\n]", variable_name, value);
于 2011-08-11T18:58:21.070 に答える
1

基本的にINIファイルと似ていません。

クイック検索はこれを思いつきます: http://code.google.com/p/inih/

依存関係が最小限です。

必要に応じて、セクションの処理を簡単に取り除くことができます。

ただし、セミコロンの処理を追加する必要があります。これは通常、INI ファイルのコメントの始まりです。

少なくとも、それは出発点です。

于 2011-08-11T18:33:33.303 に答える
1

あなたはレモンパーサージェネレーターを使うことができます.stdlibc以外に依存関係のないファイルを生成します. これは良い開始チュートリアルです。

スキャナーとしては、同じくパブリックドメインのre2cを好みます。

yyparse()本当に C++ が必要な場合は、C++ クラスで関数をラップできます。

于 2011-08-11T18:51:28.007 に答える