具有链接列表内存转储的结构

时间:2010-08-14 12:13:04

标签: c memory-management linked-list nested-lists diskimage

我是否有任何标准方法在学校错过了以合理的方式在磁盘上转储C 结构和嵌套链接列表? 我不想做的是:

  • 使用协议缓冲区或任何其他类似的序列化器,
  • 不想创建JSON,XML或其他

我的想法很少:

  • 分配准确的内存量(或扩展现有的内存量)并自行管理,将列表元素放在堆栈中,使用一些额外的字段来管理相对地址。必要时在磁盘上转储块。具有从磁盘映射块的过程创建了理解Byte-order的理想结构。
  • 将主结构推送到文件,然后推送List元素,将有关列表的信息存储在文件的标题中。

为了对此进行成像,我将提供更多详细信息,并发布示例代码:

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上。

修改

我扩展了主体结构,似乎前一个没有完全表明问题。 我知道磁盘上的指针是无用的。 允许创意和伪代码。

3 个答案:

答案 0 :(得分:2)

我没有正确理解您的问题,但将结构转储到磁盘并可靠地读取它有多个问题。

最重要的一个是结构填充或字节填充。所以你也必须照顾它。

答案 1 :(得分:1)

没有简洁的方法可以做到这一点,因为这些将有内存地址,下次读入时,它将包含可能无效的内存地址...你唯一能做的就是持有要读取/写入数据的区域,让我们看看如何根据链表的内容将数据写入磁盘...

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

并在撰写前使用memsetmemmove

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

现在您可以将rwBuf写入档案......我将把相反的操作作为练习...

答案 2 :(得分: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,为结构数据定义归零块。

相关问题