1

我在 c 中有一个数据结构,它是一个结构指针数组:

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;
};

我想将数组写入文件。我知道我需要在“下一个”指针和链表中的每个元素中写入对象,但是我该怎么做才能成功地将它读回到我的原始数组中(数组中有链接也)?

4

3 回答 3

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。如果是这样,这是一个快照。

写作时:

  1. 写出trex链表中的第一个结构
  2. 循环并一次写出struct list *filenames第一个trex结构的
  3. 对链表中的下一项重复#1,trex直到链表用完。

在阅读时,请记住:你所有的指针最初都是毫无价值的。您必须自己将它们缝合在一起。但是这些结构在文件中以正确的顺序排列。

  1. 阅读第一个trex结构。你知道它的大小,阅读它不是问题。next将指针固定为空。
  2. 循环并一次读取每struct list *filenames一个。您知道它们有多少是因为fn_len您刚刚阅读的结构。将该链接列表缝合在一起并将其附加到 trex 结构。
  3. 对下一个结构重复 #1trex直到 EOF,将结构适当地连接到链表的末尾。

那应该照顾它。

于 2012-09-28T14:15:28.813 回答
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。一旦它发生变化(例如从ID0ID1),您需要前进到 的下一个条目trex_arr。还要记住,当您读取文件时,读取的结构中的指针是无效的,您应该手动正确修复它们。

或者,您可以在保存期间遍历每个链表直到结束,以找出其长度并trex在保存每个链之前存储结构的数量。

于 2012-09-28T14:35:42.690 回答
-1

我不太确定您的要求是什么,但如果我理解正确,您只是希望能够在将您找到的所有内容写入文件后到达末尾时返回列表的开头?

我要做的是存储列表的第一个结构的地址,以便您可以随时回到开头。另一种解决方案是制作一个上一个/下一个双链列表,这样您就可以毫无问题地来回走动。将您在第一个链接的 prev 中的喜欢设置为 0,这样您就可以知道它是开始。

如果您能提供更多详细信息,我可能会更有帮助,但不太确定您的要求。

于 2012-09-28T14:12:11.087 回答