0

プログラムがいくつかの要件を満たすノードで観察された要素のみを読み取り/保存するように、「XML」のようなファイルを読み取る方法についていくつか提案をお願いします。次の方法で2つのfgetsを使用することを考えていました:

while (fgets(file_buffer,line_buffer,fp) != NULL)
 {
   if (p_str = (char*) strstr(file_buffer,"<element of interest opening")) )
    {
      //new fgets that starts at fp and runs only until the end of the node
       {
         //read and process
       }
    }
 }

これは理にかなっていますか、それとももっとスマートな方法がありますか?

第二に (私の考えでは)、新しい FILE* (fr など) を定義し、2 番目の fgets の開始時に fr を fp に設定する必要がありますか、それとも元のファイルポインターを何らかの方法で悪用できますか?

4

2 に答える 2

2

Xmllib2 http://xmlsoft.org/xml.htmlのような XML パーサーを使用します。

于 2013-01-24T10:28:09.880 に答える
0

あなたのアプローチは仕事にとって悪くないようです。

ファイルから行全体を読み取り、sprintf、strstr、または任意の関数を使用して処理できます。これにより、FILE I/O の時間と不要なオーバーヘッドを節約できます。

2番目のアイデアに従って、同じファイルポインターを使用してfseek()(Refer: man fseek) またはrewind()(Refer: ) を使用できます。追加のファイル ポインターは必要ありません。man rewindfp

編集:

タグ形式を XML 構造に準拠するように変更できれば、libXML2 などのライブラリを適切に使用できるようになります。

それが不可能な場合は、独自のパーサーを作成する必要があります。いくつかの指針:

  1. まず、ファイルからバッファーにデータを抽出します。バッファーのサイズと、動的に割り当てられるか静的に割り当てられるかは、仕様によって異なります。

  2. 非空白文字<またはタグが通常開始する文字である場合、バッファ内を検索します。そうでない場合は、エラーを表示して終了できます。

  3. タグ名の後に、最初の空白、または / または > 文字まで続くようになりました。それらを保存します。=、文字列などを必要に応じて処理します。

  4. 次の非空白文字が / の場合は、その後に > が続くことを確認します (または、タグが終了しているかどうかを確認するための仕様内の同様のパターン)。その場合は、解析が終了し、結果を返すことができます。それ以外の場合は、タグの形式が正しくないため、エラーで終了する必要があります。

    文字が > の場合、開始タグの末尾が見つかりました。では内容に続きます。それ以外の場合、次に続くのは引数です。それを解析し、結果を保存して、ステップ 4 に進みます。

  5. < 文字が見つかるまで内容を読んでください。

  6. その文字の後に / が続く場合、それは終了タグです。タグ名と>が続いていることを確認してください。はいの場合は結果を返し、そうでない場合はエラーをスローします。

  7. ここまで来ると、ネストされた XML の始まりを見つけたことになります。このアルゴリズムでそれを解析してから、再び 4 に進みます。

非常に基本的な考え方ですが、始めるのに役立つことを願っています。

編集: ファイルをポインタとして参照したい場合は、mmap().

mmap少しのshared memoryIPC と適切なメモリ ロック機能を追加すると、ほとんどのファイルをより高速に処理する並列処理プログラムを作成できます。

于 2013-01-24T10:27:14.867 に答える