我在c中有一个数据结构,它是一个struct指针数组:
struct trex *trex_arr[128];
struct trex{
struct trex *next;
char name[LEN];
unsigned int id;
int groups[LEN];
struct list *filenames; //linked list
unsigned int fn_len;
};
我想将数组写入文件。我知道我需要在“下一个”指针和链表中的每个元素中编写对象,但是我该怎么做才能将它成功读回到原始数组中(在数组中有链接)还有)?
答案 0 :(得分:1)
徒手,最简单的方法是按顺序写出结构,以便:
[trex item #1]
[list item #1]
[list item #2]
[list item #3]
[trex item #2]
[list item #1]
[list item #2]
[list item #3]
[list item #4]
etc...
(当然,这只是它的一部分。这些是二进制写入,这只是一个视觉。)
我希望fn_len
描述链接列表struct list *filenames
中的项目数。如果是这样,这很容易。
写作:
trex
链接列表中的第一个结构struct list *filenames
结构中循环并写出trex
trex
链接列表中的下一个项目重复#1,直到列表用完为止。在阅读时,请记住:你的所有指针最初都将毫无价值。你必须自己将它们拼接在一起。但是结构在文件中以正确的顺序排列。
trex
结构。你知道它的大小,读它不是问题。将next
指针修复为空。struct list *filenames
一个。你知道它们有多少,因为你刚读过的结构中有fn_len
。将链接列表拼接在一起并将其附加到trex结构。trex
结构重复#1直到EOF,根据需要将结构连接到链接列表的末尾。这应该照顾它。
答案 1 :(得分:0)
在保存到文件期间,请浏览trex_arr
。每个指针表示单独链表的开头。对于每个这样的列表,您应该分配一些ID(任何数字都可以,但相邻列表应该有不同的ID)。在保存每个trex
结构之前,请将ID写入文件。
在每个结构之后,您将拥有文件名列表(由于您知道列表中的元素数量,因此您不需要任何ID)。
假设我们有这样的结构:
trex_arr[0]: trex (3 filenames) -> trex (2 filenames) -> NULL
trex_arr[1]: trex (2 filenames) -> NULL
trex_arr[2]: trex (1 filenames) -> NULL
因此,输出文件中将包含以下内容:
ID0
trex0
filename0
filename1
filename2
ID0
trex1
filename0
ID1
trex2
filename0
filename1
ID2
trex3
filename0
回读数据非常简单。您应该跟踪ID。一旦更改(例如从ID0
更改为ID1
),您需要前进到trex_arr
的下一个条目。还要记住,当您读取文件时,读取的结构中的指针无效,您应该手动正确地修复它们。
或者,您可以在保存期间遍历每个链接列表直到结束,以找出其长度并在保存每个链之前存储trex
结构的数量。
答案 2 :(得分:-1)
我不太确定你的要求是什么,但如果我理解得对,你只是希望能够在你找到所有你找到的文件后到达结尾时回到列表的开头?
我要做的是存储列表第一个结构的地址,以便您可以随时返回到开头。 另一个解决方案是制作一个prev / next双链表,这样你就可以毫无问题地来回走动。 将你的第一个链接的prev设置为0,这样你就可以知道它是开始。
如果你能提供更多详细信息,我可能会更有帮助,但不太确定你的要求。