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

  • 使用协议 - 缓冲器或任何其他等序列化器,
  • 不想创建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。

编辑:

我已经扩展了主结构,似乎以前的结构还没有完全指出问题。我知道磁盘上的指针没有用。允许想法和伪代码。

有帮助吗?

解决方案

按照链接列表中保存的顺序序列化数据,记录风格到文件。 fwrite 特别好。确保取消指针,并意识到Endianness在此中的作用。

这是一些模糊的伪代码:

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 对于字符字符串(一个明显的选择)和零块用于结构数据。

其他提示

我没有正确理解您的问题,但是将结构倒入磁盘并可靠地读取磁盘有多个问题。

最重要的是结构填充或字节填充。因此,您还必须照顾好此。

没有任何整洁的方法可以执行此操作,因为这些方法将具有内存地址,并且下次阅读时,它将包含可能无效的内存地址...您唯一可以做的就是为数据提供一个保留区域要阅读/书写,让我们看一下如何根据链接列表的内容将数据写入磁盘...

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