fread'ing и fwrite'ing структура, содержащая указатели [дубликаты]
This question already has an answer here:
Writing and reading (fwrite - fread) structures with pointers 3 answersgcc (GCC) 4.7.0
c89
Привет,
У меня есть следующая структура, которую я пытаюсь написать и переписать.
Однако, потому что мое устройство и ресурс являются указателями. Fwrite будет читать значения указателя, а не данные. Я не могу использовать массив для устройства или ресурса. Только указатели, так как они должны быть выделены динамически.
Я выделяю всю память для элементов структуры, прежде чем писать. Здесь не показано, так как я хочу, чтобы фрагмент был коротким. Также не является бесплатным.
В моей функции 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;
}