具有链表内存转储的结构

有没有标准的方法,我在学校错过了以合理的方式在磁盘上转储嵌套链表的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. 编辑: 我扩展了主体结构,看起来像前一个没有充分说明问题。 我知道磁盘上的指针是无用的。 允许的想法和伪代码。     
已邀请:
按照它在链表中保存的顺序对数据进行序列化,将记录样式添加到文件中。
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 如果您开始嵌套更高级的结构,例如其他链接列表,可变长度字符串等,则需要为每条记录提供类型和长度,以及在其他记录中嵌套记录的方法。 例如,如果您的顶级链接列表的数据成员是另一个列表,则最好将该成员存储为嵌套记录,并包含长度和类型字段。或者,您可以定义标记记录,例如字符串的
(显而易见的选择),以及结构数据的归零块。     
我没有正确理解您的问题,但将结构转储到磁盘并可靠地读取它有多个问题。 最重要的一个是结构填充或字节填充。所以你也必须照顾它。     
没有简洁的方法可以做到这一点,因为它们将具有内存地址,并且在下次读入时,它将包含可能无效的内存地址...您唯一能做的就是拥有数据保留区域要读/写,让我们看看如何根据链表的内容将数据写入磁盘... struct rwBufferData {     int a;     char t [10]; }; 并在写作之前使用
memset
memmove
填充'rwBufferData' struct rwBufferData rwBuf; struct data * dataPtr; memset(&rwBuf,' 0',sizeof(struct rwBufferData)); memmove(&rwBuf,dataPtr,sizeof(struct rwBufferData)); 现在你可以写
rwBuf
到文件......我将把反向操作作为练习...     

要回复问题请先登录注册