带有链接列表内存转储的结构
-
28-09-2019 - |
题
我在学校错过了任何标准方法 带有嵌套链接列表的结构 以合理的方式在磁盘上?我不想做的是:
- 使用协议 - 缓冲器或任何其他等序列化器,
- 不想创建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” memset
和 memmove
struct rwBufferData rwBuf; struct data *dataPtr; memset(&rwBuf, '\0', sizeof(struct rwBufferData)); memmove(&rwBuf, dataPtr, sizeof(struct rwBufferData));
现在你可以写 rwBuf
要提交...我将作为练习留下反向操作...
不隶属于 StackOverflow