fread'ing и fwrite'ing структура, содержащая указатели [дубликаты]

На этот вопрос уже есть ответ здесь:

Написание и чтение (fwrite - fread) структур с указателями 3 ответа
gcc (GCC) 4.7.0
c89

Привет,

У меня есть следующая структура, которую я пытаюсь написать и переписать.

Однако, потому что мое устройство и ресурс являются указателями. Fwrite будет читать значения указателя, а не данные. Я не могу использовать массив для устройства или ресурса. Только указатели, так как они должны быть выделены динамически.

Я выделяю всю память для элементов структуры, прежде чем писать. Здесь не показано, так как я хочу, чтобы фрагмент был коротким. И не свободенING.

В моей функции fread я выделяю память для устройства и ресурса, чтобы fread считывал эти области памяти. Однако это не сработает.

Каков наилучший способ сделать это?

Большое спасибо за любой совет

struct data {
    int id;
    int set;
    char *device;
    char *resource;
};

struct database {
    struct data **db_data;
    size_t database_rows;
    size_t database_data_size;
};

int database_write(FILE *fp, const struct database *db)
{
    rewind(fp);

    if(fwrite(*db->db_data, sizeof(struct data), 1, fp) == -1) {
        return DATABASE_ERROR;
    }

    return 0;
}

struct database* database_read(FILE *fp, size_t db_rows, size_t db_data_size)
{
    struct database *db = NULL;
    size_t i = 0;

    db = malloc(sizeof(struct database));

    db->database_rows = db_rows;
    db->database_data_size = db_data_size;
    db->db_data = malloc(sizeof(struct data) * db_rows);

    for(i = 0; i < db_rows; i++) {
        db->db_data[i] = malloc(sizeof(struct data));
        db->db_data[i]->device = malloc(db_data_size);
        db->db_data[i]->resource = malloc(db_data_size);
    }

    rewind(fp);

    if(fread(*db->db_data, sizeof(struct data), 1, fp) == -1) {
        return NULL;
    }

    return db;
}

Ответы на вопрос(3)

Ваш ответ на вопрос