次の構造に従う単純なパーサーと小さなテキスト ファイルを作成しようとしています。
変数名 = 値;
VARIABLE_2 = SECOND_VALUE;
ただし、機能するメソッドが見つかった場合は、Boost などの多くのライブラリを使用します。できればSTDのライブラリだけで簡単に作成できるのだろうか。
ありがとう、ブルーノ・アラノ。
変数と値に等号またはセミコロンを含めることができず、ファイルが常に整形式であると想定できる場合、これは簡単です。
セミコロンに到達するまですべてをつかみます。=
記号で文字列を分割します。最初の部分は変数名です。2番目の部分は値です。
コメント、文字列リテラル値(=
またはを含む場合があります;
)を処理する必要がある場合、これは重要であり、を使用する必要がありますboost.Spirit
。
文字列を分割する方法がわからない場合は、このトピックについて多くの質問がありますが、特に良い質問は次のとおりです。C ++で文字列を分割しますか?
あなたのフォーマットがあなたがリストしたままであり、変数名にも値にもスペースがない場合、これは と の組み合わせを使用して簡単に行うことができ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
ある必要はありませんが、使用するデータ型に対して定義されている他の型を指定できます。char
istream& operator>>(istream&, type&)
本当に短い (C スタイルの) メソッドは次のようになります。
scanf("%s = %[^\n]", variable_name, value);
基本的にINIファイルと似ていません。
クイック検索はこれを思いつきます: http://code.google.com/p/inih/
依存関係が最小限です。
必要に応じて、セクションの処理を簡単に取り除くことができます。
ただし、セミコロンの処理を追加する必要があります。これは通常、INI ファイルのコメントの始まりです。
少なくとも、それは出発点です。
あなたはレモンパーサージェネレーターを使うことができます.stdlibc以外に依存関係のないファイルを生成します. これは良い開始チュートリアルです。
スキャナーとしては、同じくパブリックドメインのre2cを好みます。
yyparse()
本当に C++ が必要な場合は、C++ クラスで関数をラップできます。