2012-09-28 160 views
1

的数组c写入和读出的文件I具有在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; 
}; 

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

+0

最简单的方法是序列化并将其反序列化为XML,但对于C语言,您需要一个库支持。如何使用标题?然后你知道你遇到了这个对象的链表,并相应地创建你的链表。这是你的问题还是我误解了它? –

+0

你使用头文件的意思是什么? – user1190650

+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... 

(当然,这只是排序它的JIST的这些都是二进制写,这是只有视觉)

我希望fn_len描述了链接列表struct list *filenames中的项目数。如果是这样,这很简单。

在写作:

  1. 写出在trex链表
  2. 循环的第一结构,同时写出从第一trex结构之一struct list *filenames
  3. 重复#1对下一个项目在trex链接列表中,直到列表耗尽。

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

  1. 阅读第一个trex结构。你知道它的大小,读它不是问题。将next指针修复为空。
  2. 循环并逐个读取每个struct list *filenames。你知道他们有多少是因为刚刚阅读的结构中有fn_len。将该链表拼接在一起并将其附加到trex结构。
  3. 重复#1与下一个trex结构,直到EOF,根据需要将结构连接到链表的末尾。

而且应该照顾它。

+0

非常感谢后,这真​​的很有帮助。只是为了澄清,因为每个trex结构都有一个指向下一个trex结构体的指针(所以我们有一个二维数组结构),我不知道每个数组索引处每个trex结构链的起始长度是多少。你认为最简单的方法是列出每个链条有多长时间? – user1190650

+0

你不应该知道'trex'的列表有多长。只需知道'struct list'的每个链多长时间以便读回时,您不必确定下一个读取是下一个“trex”还是下一个“结构列表”。你阅读每个'struct list',直到你从前一个'trex'到达'fn_len',并且读取'trex'直到EOF。 –

+0

谢谢!它现在很好用! – user1190650

-1

我不太清楚你在问什么,但如果我理解正确,你只是想在你在文件中写完所有内容后才能返回到列表的开头。

我会做的是股票的列表的第一个结构的地址,以便您可以回到开始任何时候你想要的。 另一种解决方案是创建一个prev/next双链表,以便您可以来回访问而不会出现任何问题。 将你的第一个链接的prev设置为0,以便你可以知道它是开始。

如果你可以提供更多的细节,我可以更有帮助,但不太清楚你的要求。

+0

问题是关于将整个结构保存到文件并将其读回来。 –

+0

好的我明白了。那么最好的解决方案是将其保存为xml或xml文件。 下载一个lib或制作你自己的。 – Jp1987

+0

哪些库适用于这种类型的XML输出?我认为按照上面的描述写出每个结构和链表将会很好,但是我想知道写入/来自XML将是一个简单的解决方案。 – user1190650

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结构的数目。

+0

非常感谢,现在它工作得很完美 – user1190650