0

ネストされたリンクリストを含むC構造体を妥当な方法でディスクにダンプするために学校で見逃した標準的なアプローチはありますか?私がしたくないことは次のとおりです。

  • プロトコルバッファまたは他の同様のシリアライザタを使用し、
  • 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;
};

乾杯P。

編集:

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

4

3 に答える 3

2

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

最も重要なものは、構造パディングまたはバイト スタッフィングです。そのため、それにも注意を払う必要があります。

于 2010-08-14T19:25:48.870 に答える
1

これらにはメモリアドレスがあり、次に読み込まれるときに、無効である可能性のあるメモリアドレスが含まれるため、これを行うための適切な方法はありません...実行できる唯一のことは、データの保持領域を用意することです読み書きするために、リンクリストの内容に基づいてデータをディスクに書き込む方法を見てみましょう...

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

memsetを使用して書き込む前に、「rwBufferData」を入力します。memmove

struct rwBufferData rwBuf;
構造体データ*dataPtr;
memset(&rwBuf、'\ 0'、sizeof(struct rwBufferData));
memmove(&rwBuf、dataPtr、sizeof(struct rwBufferData));

これで、ファイルに書き込むことができrwBufます...逆の操作は演習として残しておきます...

于 2010-08-14T12:30:56.167 に答える
0

リンクされたリストに保持されている順序でデータをシリアル化し、レコード スタイルでファイルに保存します。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

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

たとえば、トップ レベルのリンク リストに別のリストであるデータ メンバーが含まれている場合、そのメンバーをネストされたレコードとして格納し、長さとタイプ フィールドを指定するのが最適です。\0または、文字列 (当然の選択)などのセンチネル レコードや、構造体データのゼロブロックを定義することもできます。

于 2010-08-14T12:52:29.243 に答える