c使用结构指针数组写入和读取文件

c使用结构指针数组写入和读取文件,c,pointers,file-io,struct,io,C,Pointers,File Io,Struct,Io,我在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; }; 我想将数组写入文件。我知道我需要在下一个指针中写入对象

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

我想将数组写入文件。我知道我需要在下一个指针中写入对象,并在链表中写入每个元素,但是我如何才能成功地将其读回我的原始数组中?数组中也存在链接?

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

我要做的是存储列表第一个结构的地址,以便您可以随时返回开始。 另一种解决方案是制作上一个/下一个双链列表,这样您就可以在没有任何问题的情况下来回移动。 将第一个链接的上一个链接中的like设置为0,以便知道它是开始


如果你能提供更多的细节,我会更有帮助,但不太确定你的要求。

简单地说,最简单的方法是按顺序写出结构,以便:

[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*文件名中的项数。如果是这样的话,这是一个瞬间

书面:

写出trex链表中的第一个结构 循环并写出第一个trex结构中的struct list*文件名,每次一个 对trex链接列表中的下一项重复1,直到列表用尽。 阅读时,记住:你所有的指针最初都是毫无价值的。你得自己把它们缝在一起。但这些结构在文件中的排列顺序是正确的

阅读第一个trex结构。你知道它的大小,阅读它不是问题。将下一个指针修复为nothing。 循环并每次读取一个struct list*文件名。你知道有多少是因为你刚才读到的结构中的fn_len。将链接列表缝合在一起并将其附加到trex结构。 对下一个trex结构重复1,直到EOF,根据需要将该结构连接到链表的末尾。
这就应该解决了

在保存到文件的过程中,通过trex\u 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结构的数量。

最简单的方法是将其序列化并反序列化为XML,但对于C情况,您需要库支持它。使用标题怎么样?然后,您知道您遇到了对象的链接列表,并相应地创建了链接列表。这是您的问题还是我误解了?您使用标题的确切含义是什么?在输出文本文件上,放置一些指示链接列表开头的标识符。它应该与保留的数据是唯一的,这样每当你遇到这样的数据时,你的程序就会知道链表正在启动。trex_arr是否保留每个都是新列表开始的指针?当trex_arr[3]==trex_arr[50]->下一步时会出现这种情况吗?@maximsurydin不,链表或链表中没有循环。问题是如何将整个结构保存到文件中并将其读回。啊,好的,我明白了。最好的解决方案是将其保存到xml或类似xml的文件中。下载一个库或者制作自己的库。哪些库适合这种类型的XML输出?我认为如上所述写出每个结构和链表会很好,但我想知道从XML写/写是不是一个简单的解决方案。让我们做所有的工作。您给它赋值,它就会生成xml。还有解析器。非常感谢你的帖子,这真的很有帮助。只是想澄清一下,因为每个trex结构都有一个指向下一个trex结构的指针,所以我们有一个类似于二维数组的结构,我不知道每个trex结构链从每个数组索引开始有多长。你认为保存一个链子的长度列表是最容易的吗?你不必知道trex的列表有多长。它方便的唯一原因是
o了解每个结构列表链的长度,以便在回读时,您不必决定下一次读取是下一个“trex”还是下一个“结构列表”。您阅读每个结构列表,直到您从上一个trex到达fn_len,并且您阅读trex直到EOF。非常感谢!现在效果很好!非常感谢,它现在工作得很好