将结构保存到文件

Saving structs to file

我正在尝试将结构列表保存到文件中并稍后加载它们。

我想从对象数组中输出第一个对象的数据,但是当我试图通过他的指针加载和打印结构的对象时(变量:nameage ) 程序的输出是这样的:Name: | Age: 0.

预期的是:Name: Tom | Age: 15

(以person object[3] = {"Tom", 15, "Andrew", 25, "Kate", 55};为例)。

我尝试为此使用 fseek 函数,如何使用它来仅打印第一个对象?

    #include <stdio.h>
    #include <stdlib.h>

    typedef struct
    {
        char name[20];
        int age;
    } person;

    void save(int x, char way[100], person (*p_object)[x]);
    void load(char way[100], int x);

    FILE *file;

    int main(void)
    {
        char way[100] = "D:\Projects\C\C06_WorkingWithFiles\C005_PositioningInTheStream.dat";
        person object[3] = {"Tom", 15, "Andrew", 25, "Kate", 55};
        person (*p_object)[3] = &object;
        save((sizeof(*p_object) / sizeof(*p_object)[0]), way, p_object);
        load(way, 1);
        fclose(file);
        return 0;
    }

    void save(int x, char way[100], person (*p_object)[x])
    {
        if (fopen(way, "r") == NULL)
        {
            file = fopen(way, "w");
        }

        char *c = (char *)p_object;
        for (int i = 0; i < sizeof(*p_object); i++)
        {
            putc(*c, file);
            c++;
        }
    }

    void load(char way[100], int x)
    {
        if ((fopen(way, "r")) == NULL)
        {
            perror("\nError");
            exit(0);
        }

        int position = sizeof(person) * x;
        fseek(file, position, SEEK_SET);

        person object, *p_object = &object;
        char symbol, *c = (char *)p_object;
        while ((symbol = getc(file)) != EOF)
        {
            *c = symbol;
            c++;
        }
        printf("\nName: %s | Age: %d\n", p_object -> name, p_object -> age);
    }

这是一个可以满足您要求的实现:

#include <stdio.h>

typedef struct {
    char name[20];
    int age;
} person;

void save(int num, char path[100], person (*p_object)[num]);

person load(char path[100], int index);


int main(void) {
    char path[100] = "output.dat";
    person persons[3] = {"Tom", 15, "Andrew", 25, "Kate", 55};

    save(3, path, &persons);
    person object = load(path, 1);
    printf("\nName: %s | Age: %d\n", object.name, object.age);

    return 0;
}

void save(int num, char path[100], person (*p_object)[num]) {
    FILE *file = fopen(path, "w+");
    fwrite(p_object, sizeof(person), num, file);
    fclose(file);
}

person load(char path[100], int index) {
    person object;
    FILE *file = fopen(path, "r");
    fseek(file, (long) sizeof(person) * index, SEEK_SET);
    fread(&object, sizeof(person), 1, file);
    fclose(file);

    return object;
}

请注意,最好使用现有功能fread and fwrite而不是自己实现。

这将使您的代码更简单直接。

此外,您对 fread 的实现不正确,因为 EOF 可以出现在那里,因为您正在写入二进制数据,您需要读取结构的整个大小才能加载它。