1

私は構造体ポインタの配列であるcのデータ構造を持っています:

struct trex *trex_arr[128];

struct trex{
    struct trex *next;
    char name[LEN];
    unsigned int id; 
    int groups[LEN];
    struct list *filenames; //linked list
    unsigned int fn_len;
};

配列をファイルに書き込みたい。「次の」ポインターにオブジェクトを書き込み、リンクされたリストの各要素も書き込む必要があることは理解していますが、元の配列に正常に読み取ることができるようにするにはどうすればよいですか (配列に連鎖があります)同じように)?

4

3 に答える 3

1

それを行う最も簡単な方法は、次のように構造を順番に書き出すことです。

[trex item #1]
[list item #1]
[list item #2]
[list item #3]
[trex item #2]
[list item #1]
[list item #2]
[list item #3]
[list item #4]
etc...

(もちろん、これは単なる要旨です。これらはバイナリ書き込みであり、これはビジュアルのみです。)

fn_lenリンクされたリスト内のアイテムの数を説明していることを願っていますstruct list *filenames。もしそうなら、これはスナップです。

書き込み時:

  1. trex連結リストの最初の構造を書き出す
  2. struct list *filenamesループして、最初のtrex構造体から一度に 1 つずつ書き出します
  3. trexリストが使い果たされるまで、リンクされたリストの次の項目で #1 を繰り返します。

読んで、覚えておいてください:あなたのポインタはすべて、最初は価値がありません. それらを自分で縫い合わせる必要があります。しかし、構造はファイル内で正しい順序で配置されています。

  1. trex最初の構造を読み取ります。あなたはそのサイズを知っています、それを読むことは問題ではありません. nextポインターを無に固定します。
  2. 一度に 1 つずつループして読み取りますstruct list *filenamesfn_lenたった今読んだ構造のおかげで、それらがいくつあるかがわかります。そのリンクされたリストをつなぎ合わせて、それを trex 構造に添付します。
  3. EOF まで次の構造で #1 を繰り返しtrex、必要に応じて構造を連結リストの最後に結合します。

そして、それはそれを処理する必要があります。

于 2012-09-28T14:15:28.813 に答える
0

ファイルへの保存中はtrex_arr. 各ポインタは、個別のリンク リストの先頭を示します。そのようなリストごとに、何らかの ID を割り当てる必要があります (任意の番号でかまいませんが、隣接するリストには異なる ID を指定する必要があります)。各trex構造を保存する前に、ID をファイルに書き込みます。

各構造の後にファイル名リストがあります (リスト内の要素の数がわかっているので、ID は必要ありません)。

次のような構造があるとします。

trex_arr[0]: trex (3 filenames) -> trex (2 filenames) -> NULL
trex_arr[1]: trex (2 filenames) -> NULL
trex_arr[2]: trex (1 filenames) -> NULL

その結果、出力ファイルには次のようになります。

ID0
trex0
filename0
filename1
filename2
ID0
trex1
filename0
ID1
trex2
filename0
filename1
ID2
trex3
filename0

データを読み戻すのは非常に簡単です。ID を追跡する必要があります。変更したら (たとえば からID0ID1)、 の次のエントリに進む必要がありますtrex_arr。また、ファイルを読み取っているときは、読み取った構造体からのポインターが無効であるため、手動で適切に修正する必要があることに注意してください。

または、保存中に各連結リストを最後までトラバースして、その長さを調べ、trexすべてのチェーンを保存する前に構造の数を保存することもできます。

于 2012-09-28T14:35:42.690 に答える
-1

あなたが何を求めているのかよくわかりませんが、私が正しく理解していれば、見つけたものをすべてファイルに書き込んだ後、最後に到達したときにリストの最初に戻ることができるようにしたいだけですか?

私がすることは、リストの最初の構造のアドレスをストックして、いつでも最初に戻ることができるようにすることです。別の解決策は、前/次の二重連鎖リストを作成して、問題なく前後に移動できるようにすることです。最初のリンクの前のいいねを 0 に設定して、それが始まりであることを認識できるようにします。

詳細を教えていただければ、もっと役立つかもしれませんが、あなたが何を求めているのかよくわかりません.

于 2012-09-28T14:12:11.087 に答える