1

C++ を使用して、かなり複雑ではあるが構造化されたファイルを解析しようとしています。

011 FistName MiddleName LastName age(int) date(4/6/2001) position status ...
012 FistName MiddleName LastName age(int) date(4/6/2001) position status ...
...

ファイル形式はこんな感じ。データを構造体の個々のフィールドとして保存しようとしていますが、最初のミドルネームは可変サイズであり、ミドルネームが含まれていない可能性があります。どのように区別しますか?

例えば、

014 Jon Smith ...
015 Jon J Smith, Jr. ...

名前を区切るのではなく、名前全体を名前フィールドに保存したい。私たちが持っていると言う

struct{
    std::string name;
    int id;
    int age;
    std::string position;
    ...

}

すべてを解析するにはどうすればよいですか?

4

2 に答える 2

1

目的のために、C++ 11 を使用している場合は、std::regex 一致の例を調整して、目的を達成できます。

そうでない場合は、boost::regexを使用して目的を達成する必要があります。

使用できる正規表現の例を次に示します。

^\d+ (\w+) ?(\w*) (\w+),? ?(\w+\.)? age\((\d+)\) date\((\d\/\d\/\d+)\) (\w+) (\w+)

正規表現が何を意味し、どのように一致するかを調べるには、このリンクをチェックしてください。

正規表現の詳細については、Jeffrey Friedl によるこの本を強くお勧めします。

これは次のものに一致します。

014 Jon Smith age(32) date(4/6/2001) position status
014 Jon J Smith, Jr. age(16) date(4/6/2001) position status
015 FistName MiddleName LastName, Title. age(45) date(4/6/2001) position status
016 FistName MiddleName LastName age(7) date(4/6/2001) position status
039 FistName MiddleName LastName age(100) date(4/6/2001) position status
于 2013-02-01T00:56:30.673 に答える
0

単純に fstream を使用して、一度に 1 単語ずつ取得することができます。最初に int に、次に次の値が int (年齢) になるまで文字列に変換します。無限ループから正しく思い出すと、ストリームが数値ではないときにintにストリーム入力を行うと、ストリームから値が取得されないため、>> int、>> string >> int >>などを行うことができます。年齢があります。

等等あなたはポイントを得る:)

PS: 入力ループには .eof() ではなく .get() を使用することを忘れないでください :)

于 2013-01-31T22:36:43.903 に答える