質問

私が学校で逃したことを逃した標準的なアプローチはありますか ネストされたリンクされたリストを備えた構造 妥当な方法でディスクに?私がやりたくないのは:

  • プロトコルバッファーまたは他のシリアル化器を使用して、
  • JSON、XMLなどを作成したくない

アイデアはほとんどありません:

  • 正確なメモリ量を割り当て(または既存のものを拡張)し、自分で管理し、リスト要素をスタックに配置して、いくつかの追加のフィールドを使用して相対アドレスを管理します。必要な場合は、ディスクにブロックをダンプします。ディスクからブロックをマッピングする手順があると、バイトオーダーを認識している望ましい構造が作成されます。
  • メイン構造をファイルに押してから、リスト要素を押し、ファイルのヘッダーにリストに関する情報を保存します。

これを画像化するには、いくつかの詳細を示します。

typedef struct{
   int b;
   List *next;
}List;

typedef struct{
   float b;
   List2 *next;
}List2;

typedef struct{
   List *head;
   List *tail;
} info;

typedef struct{
   List2 *head;
   List2 *tail;
} info2;

struct data
{
    int a;
    char t[10];
    info first;
    info second;
    info2 third;
};

Cheers P.

編集:

私はメイン構造を拡張しましたが、以前の構造は問題を完全に示していないようです。ディスク上のポインターは役に立たないことを知っています。アイデアと擬似コードが許可されています。

役に立ちましたか?

解決

リンクされたリストに保持されている順序でデータをシリアル化し、ファイルにレコードスタイルにします。 fwrite これに特に良いです。ポインターを繰り返し、エンディアンネスがこれに果たす役割に注意してください。

これが曖昧な擬似コードです:

List *list_new();
List *list_add(List *, void *data);
List *list_next(List *);

while (node) {
    fwrite(node->data, sizeof(node->data), 1, fp);
    node = list_next(node);
}

ライブリストに戻るための大まかなコード:

List *node = list_new();
while (true) {
    struct data *buf = malloc(sizeof(*buf));
    if (1 != fread(buf, sizeof(*buf), 1, fp))
        break;
    list_add(node, buf);
}

update0

他のリンクリスト、可変長さの文字列などのより高度な構造をネストし始めた場合、各レコードにタイプと長さを提供し、他のレコード内にレコードをネストする方法を提供する必要があります。

例として、トップレベルのリンクリストに別のリストであるデータメンバーがある場合、そのメンバーをネストされたレコードとして保存するのが最善です。または、Sentinel Recordsを定義することもできます。 \0 文字文字列の場合(明らかな選択)、およびstructデータのゼロブロック。

他のヒント

私はあなたの問題を正しく理解していませんでしたが、構造体をディスクにダンプして確実に戻って読むことには複数の問題があります。

最も重要なものは、構造のパディングまたはバイトの詰め物です。ですから、あなたもそれを世話する必要があります。

これを行うためのきちんとした方法はありません。これらにはメモリアドレスがあり、次に読まれると、無効なメモリアドレスが含まれます...できることは、データの保持エリアを持つことです。読み取り/書かれているために、リンクリストの内容に基づいてデータをディスクに書き込む方法を見てみましょう...

struct rwBufferData{
    int a;
    char t[10];
};

使用して書く前に「rwbufferdata」を記入してください memsetmemmove

struct rwBufferData rwBuf;
struct data *dataPtr;
memset(&rwBuf, '\0', sizeof(struct rwBufferData));
memmove(&rwBuf, dataPtr, sizeof(struct rwBufferData));

次に、書くことができます rwBuf ファイルするために...私は逆操作を練習として残します...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top