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

没有很好的方法可以做到这一点,因为这些将具有内存地址,并且下次读入时,它将包含可能无效的内存地址……您唯一能做的就是拥有一个数据保存区域要读/写,我们看看如何根据链表的内容将数据写入磁盘...

结构 rwBufferData{
    诠释一个;
    字符 t[10];
};

并在写入之前使用和填充“rwBufferData memsetmemmove

结构 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);
}

更新0

如果您开始嵌套更高级的结构,例如其他链表、可变长度字符串等,您将需要为每条记录提供类型和长度,以及在其他记录中嵌套记录的方法。

例如,如果您的顶级链表有一个数据成员是另一个列表,您最好将该成员存储为嵌套记录,并带有长度和类型字段。或者,您可以定义标记记录,例如\0字符串(一个明显的选择),以及结构数据的归零块。

于 2010-08-14T12:52:29.243 回答