要素のベクトルに数値の文字列を解析します。文字列は、() : /
で区切られた4つの数字のブロックで構成され、各ブロックは;
で区切られています。構造体のベクトルに数値の文字列を解析します。
具体的には、文字列の形式はint(int):float/float;
です(下のコードサンプルを参照)。私は正規表現を使うことができると思っていますが、データが構造化されているので、そのような文字列を解析するためのより簡単で簡単な方法が必要です。私はistringstreamを使用していますが、それは少し不器用な感じです。
std::string line = "0(0):0/0;1(2):0.01/0.02;2(4):0.02/0.04;3(6):0.03/0.06;"
struct Element {
int a;
int b;
int c;
int d;
};
std::vector<Element> = parse(line);
std::vector<Element> parse(std::string line)
{
std::vector<Element> elements;
std::istringstream iss(line);
while(iss) {
char dummy;
Element element;
iss >> element.a;
iss.read(&dummy,sizeof(dummy)); // (
iss >> element.b;
iss.read(&dummy,sizeof(dummy)); //)
iss.read(&dummy,sizeof(dummy)); // :
iss >> element.c;
iss.read(&dummy,sizeof(dummy)); ///
iss >> element.d;
iss.read(&dummy,sizeof(dummy)); // ;
if (!iss) {break;}
elements.push_back(element);
}
return elements;
}
私の質問:
- 解析するための良い方法だろうか?
std::stringstream
を使用して番号で番号を読み取ってその間にある文字を「切り捨てる」べきですか?コードサンプルで行ったように? - 最後の文字が読み込まれた後に
while(iss)
がまだtrueであるため、このコードにはバグがあり、追加の値を1つ読み込もうとします。iss>>
の後にテストせずにこのループを終了するにはどうすればいいですか?またはより一般的には、抽出ストリームから抽出をループする方法は?
'1 *のはsizeof(CHAR)' '式1 *のはsizeof(文字)1.'であることが保証され、値が '1'であるマジック'ダミー'と 'sizeof(char)'の文字数を参照していると思われる数字は 'ダミー'のタイプを参照しているようです。表現力や保守性のために定数1を指定しない場合は、単に 'sizeof(dummy)'を使用しないでください。現在のフォームは単に1を直接供給するよりも優れていません。 –
文字列の形式を検証することは重要ですか、それとも正しいことがわかりますか?有効であることがわかっている場合は、数字以外の任意の文字列で文字列全体を単純にトークン化することができます。あなたは 'Element'を作るのが簡単な数字のリストを残しています。 [C++で文字列をどのようにトークン化するのですか?](http://stackoverflow.com/questions/53849/how-do-i-tokenize-a-string-in-c) –
シリアライザについて考えたことはありますか?データ構造を読み取ることは、一般的な解決策に共通の問題です。 – Klaus