c使用struct指针数组编写和读取文件

时间:2012-09-28 13:58:50

标签: c pointers file-io struct io

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

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

3 个答案:

答案 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中的项目数。如果是这样,这很容易。

写作:

  1. 写出trex链接列表中的第一个结构
  2. 一次一个地从第一个struct list *filenames结构中循环并写出trex
  3. 使用trex链接列表中的下一个项目重复#1,直到列表用完为止。
  4. 在阅读时,请记住:你的所有指针最初都将毫无价值。你必须自己将它们拼接在一起。但是结构在文件中以正确的顺序排列。

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

答案 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,这样你就可以知道它是开始。

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