fread’ing和fwrite’ing包含指针的结构

gcc (GCC) 4.7.0 c89 

你好,

我有以下结构,我试图fwrite和fread。

但是,因为我的设备和资源是指针。 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_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; } 

你似乎回答了自己的问题,fread和fwrite只看内存中的内容并将其放入文件中。 如果您正在编写没有指针的东西(例如大数字数组),这非常有用。 它不是用指针编写结构的。

如果此文件具有格式,则需要执行格式所述的操作。 如果你正在编写一个格式,那么你应该逐个编写每个成员到文件中。 您需要某种缓冲区才能读入(如果没有最大长度规范,可能需要resize)。 此外,您的database_write函数也需要更改。

如果deviceresource可以具有可变长度,则应记下device的大小,然后记下数据。 为resource做同样的事情。 当你回读它们时,你可以读取大小,然后分配内存,最后读取值。

你自己描述了你的问题。 fwrite将写入地址而不是值。

可能是您可以在结构“struct data”中使用字段表示设备和资源的长度。 为fread()和fwrite()创建一个包装器,读取/写入这个长度。 在这个包装器中,您可以将设备,资源存储在临时缓冲区中并在其上使用fwrite()。

这是一个简单而非常基本的解决方案。

在网络中发送数据包时,通常会看到包含char指针的结构。 前4/8字节存储数据长度,其余字节包含实际数据。 用户读取数据包,首先读取4/8字节的开头。 根据此情况,将发出read()调用以读取剩余数据。

您可以参考“struct hack”技术上未定义的行为吗?