2012-02-21 11 views
1

私が何を読み込むためのテキストファイルは一定のパターンがあります。このファイルを扱うのC++で複雑なテキストファイルを読むには?

Name line [tag name 452,54 | tag2 name 323,2 | tag3 name 252,25 ... ] 
Name2 line [tag name 422,54 | tag2 name 33,2 | tag3 name 111,525 | tag4 name 222,2 ... ] 

最も厄介な部分は、各行ごとにタグの数が設定されていないです。

私は、ファイルを1行ずつ読み込み、パターンを読みやすくするために縫い合わせたので、scanf()を使用して変数を変数に分解するようにしていました。しかし、tag nameの語数は設定されていないので、あまり役に立ちませんでした。

データを失うことなくファイルのパターンを操作して読みやすくすることはできますが、解決策はありません。どのように私は、ファイルパターンを操作できるの 例:

Name line 
tag name 452,54 | tag2 name 323,2 | tag3 name 252,25 ... 
Name2 line 
tag name 422,54 | tag2 name 33,2 | tag3 name 111,525 | tag4 name 222,2 ... 

私は、セパレータとして[]|記号を追加しましたが、理想的にそれらの少ない、より良いです。

Name line 
tag name 452,54 
tag2 name 323,2 
tag3 name 252,25 ... 
Name2 line 
tag name 422,54 
tag2 name 33,2 
tag3 name 111,525 
tag4 name 222,2 ... 

類似のパターンで読んだことがある場合は、共有してください。私はちょっと立ち往生しています...

EDIT:これは単純な.txtファイルです。文字列値の代わりにtags namename lineを選択しました。それを簡単にするためのIDや何かがありません。

+0

これをロードしたい構造のレイアウトは何ですか?標準インデックス配列またはハッシュ? –

+1

あなたのフォーマットについてより具体的にする必要があります。 'line'はデリミタか入力の一部ですか?また、ファイル形式が少し壊れているようです。それぞれの 'N 'が位置によって定義されるときに' tagN'が存在するのはなぜですか? – pmr

答えて

1

ファイルを読むまでファイルをマングリングするのではなく、ファイル形式を定義する文法をよく見て、小さなパーサを構築する必要があります。タスクは最初は気にならないかもしれませんが、それほど難しいことではありません。

私はそのようなタスクのためにBoost.Spiritを好んでいます。

+0

明確な文法を持つファイルの精神に+1。 – user48678

+0

私はこのアイデアに同意しますが、外部ライブラリを使用することは許されません。そのため、私は苦労しています。 – Povylas

+0

@ Povylas:そして、Akshayが[彼の答え](http://stackoverflow.com/a/9382055/160206)で言及しているツールを調べるべきです。 –

1

パーサーを検索しているようです。それらの多くはオンラインです。 :) lex/yaccやバイソンなどでさえ助けることができます。

+1

これらはパーサではなく、パーサジェネレータです。 –

関連する問題