0

我有一个这样的结构;

struct abc
{
    char bbb[10];
    char ccc[4];
    char ddd[6];
    int i1;
    int i2;
    struct abc *prior, *next;
};
struct abb *start, *last, *this, *temp;

我有很多代码使用这些指针 start、last 等,所以我想使用它们,但我想添加指向结构的指针和结构内的指针以完成以下操作:然后根据数据加载结构以 i1 的值为例,当 i1 = 0 或 i1 = 1 或结构的内容时,无论 i1 的值如何,都显示和更改数据。并且,在一天结束时,将整个结构保存到文件中,其中包含在三个条件中的任何一个中所做的更改。我以为添加了如下指针:

    struct abc *prior1, *next1;
    struct abc *prior2, *next2;
};
struct abb *start1, *last1...etc.
struct abb *start2, *last2...etc.

我可以有:

start = start1;
last  = last1;

但是我该如何参考

prior1
next1

或者告诉我一个更好的方法。

4

2 回答 2

0

听起来您正在寻求有关序列化策略的建议。我建议编写免费的operator<< 和 operator>>方法来处理结构上的 I/O,其中指针在分配升序数字 ID的映射中引用对每个人的价值。编写时,在访问每个结构指针时,检查映射,如果找到 ID,则只需写出 ID 即可。否则,将下一个可用 ID 添加到映射,将 ID 分配给指针,然后写出整个结构。读取时,您反转该过程,读取每个 ID 并在地图中查找该指针。如果未找到,则您拥有第一个实例,因此您继续读取整个结构并将其存储在地图中。否则,您从映射中检索先前读取的结构并分配指针。CArchive序列化(Microsoft 基础类)使用此通用策略。可能有一些开源库可以做同样的事情。

于 2013-04-29T20:27:27.623 回答
0

你的问题不是很清楚。

您可能只需要检查 C 指针,以及start->prior引用prior包含在的值之类的语法start

例如

// Set the i1 value of start to 42

start->i1 = 42;

printf("The answer is: %d\n", start->i2);

或者,您可能希望拥有与您的结构之一进行交互的等效方法。

例如:

struct abc
{
    char bbb[10];
    char ccc[4];
    char ddd[6];
    int i1;
    int i2;
    struct abc *prior, *next;
};

struct abb *start, *last, *this, *temp;

/**
 * Set the BBB of struct target to a given value.
 * @param   value     the value to set
 * @return            pointer to the target
 */
struct abc *setBBB(struct abc *target, char *value)
{
    strncpy(target->bbb, value, sizeof(target->bbb));
    return target;
}

char *getBBB(struct abc *target)
{
    return target->bbb;
}

struct abc *next(struct abc *target)
{
    return target->next;
}

int getI1(struct abc *target)
{
    return target->i1;
}

完成以下操作:用数据加载结构然后根据 i1 的值,例如,当 i1 = 0 或当 i1 = 1 或结构的内容时显示和更改数据,而不考虑值的 i1。

你会这样做:

switch(getI1(start))
{
    case 0:
        setBBB(start, "Hello"); // NOTE: to treat this as a string,
                                // at most 9 characters are allowed,
                                // else the terminating zero will be lost.
        break;
    case 1:
        setBBB(start, "World"); // ditto.
        break;
    ...
}

并且,在一天结束时,将整个结构保存到文件中,其中包含在三个条件中的任何一个中所做的更改。

您想将结构保存到文件中,您需要类似

int saveStruct(char *filename, int position, struct abc *target)
{
    int ret;
    FILE *fp;
    if (NULL == (fp = fopen(filename, "r+")))
    {
        if (NULL == (fp = fopen(filename, "w")))
        {
            return -1; // Error.
        }
    }
    fseek(fp, position * sizeof(struct abc), SEEK_SET);
    ret = fwrite(target,  sizeof(struct abc), 1, fp);
    fclose(fp);
    return ret;
}

不过,上面有一些问题。指针(*prior 和 *next)的值一旦保存到磁盘将变得毫无意义,并且在从磁盘加载时仍然如此。因此,该loadStruct()函数将需要恢复 *prior 和 *next 的值作为附加参数。

此外,如果您之前没有在位置 #0 保存过结构,则不能(但这取决于平台)在位置 #1 保存结构。每次保存都会执行昂贵的打开和关闭。

int loadStruct(char *filename, int position, struct abc *target)
{
    int ret;
    FILE *fp;
    if (NULL == (fp = fopen(filename, "r")))
    {
        return -1; // Error.
    }
    fseek(fp, position * sizeof(struct abc), SEEK_SET);
    ret = fread(target,  sizeof(struct abc), 1, fp);

    target->prior = NULL;
    target->next  = NULL;

    fclose(fp);
    return ret;
}

// 上面,用下面的测试用例测试,返回 'Hello!' 正如预期的那样。

int main()
{
    struct abc *start, *another;
    start   = malloc(sizeof(struct abc));
    setBBB(start, "Hello!");
    saveStruct("file.bin", 0, start);

    another = malloc(sizeof(struct abc));
    loadStruct("file.bin", 0, another);

    printf("Re-read: %s.\n", getBBB(another));
}
于 2013-04-29T20:56:03.483 回答