我是否有任何标准方法在学校错过了以合理的方式在磁盘上转储C 结构和嵌套链接列表? 我不想做的是:
我的想法很少:
为了对此进行成像,我将提供更多详细信息,并发布示例代码:
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上。
修改
我扩展了主体结构,似乎前一个没有完全表明问题。 我知道磁盘上的指针是无用的。 允许创意和伪代码。
答案 0 :(得分:2)
我没有正确理解您的问题,但将结构转储到磁盘并可靠地读取它有多个问题。
最重要的一个是结构填充或字节填充。所以你也必须照顾它。
答案 1 :(得分:1)
没有简洁的方法可以做到这一点,因为这些将有内存地址,下次读入时,它将包含可能无效的内存地址...你唯一能做的就是持有要读取/写入数据的区域,让我们看看如何根据链表的内容将数据写入磁盘...
struct rwBufferData{ int a; char t[10]; };
并在撰写前使用memset
和memmove
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);
}
如果您开始嵌套更高级的结构,例如其他链接列表,可变长度字符串等,则需要为每条记录提供类型和长度,以及在其他记录中嵌套记录的方法。
例如,如果您的顶级链接列表的数据成员是另一个列表,则最好将该成员存储为嵌套记录,并包含长度和类型字段。或者,您可以为字符串(显而易见的选择)定义标记记录,例如\0
,为结构数据定义归零块。