【发布时间】:2011-04-06 03:40:18
【问题描述】:
我在 C 中有以下结构:
typedef struct sUser {
char name[nameSize];
char nickname[nicknameSize];
char mail[mailSize];
char address[addressSize];
char password[passwordSize];
int totalPoints;
PlacesHistory history;
DynamicArray requests;
}User;
typedef struct sPlacesHistory {
HistoryElement array[HistorySize];
int occupied;
int last;
}PlacesHistory;
和功能:
void serializeUser( User * user, FILE * fp ) {
fwrite( user, nameSize + nicknameSize + mailSize + addressSize + passwordSize + sizeof( int ) + sizeof( PlacesHistory ), 1, fp );
serializeDynamicArray( user -> requests, fp );
}
User * loadUser( FILE * fp ) {
User * user = malloc( sizeof( User ) );
fread( user, nameSize + nicknameSize + mailSize + addressSize + passwordSize + sizeof( int ) + sizeof( PlacesHistory ), 1, fp );
user -> requests = loadDynamicArray( fp );
return user;
}
当我加载 struct User 并打印该用户(从文件加载)时,placesHistory 的字段“last”的值为 255 或 -1,具体取决于 PlacesHistory 结构的字段顺序。但我保存的用户在该成员上的值为 -1。
所以当我得到 255 时,显然是错误的.. 我怀疑这与结构填充有关。
我怎样才能做到这一点,使得结构中字段的顺序无关紧要?
或者我需要遵循哪些标准才能使事情正常进行?
我需要一次 fwrite/fread 一个成员吗? (出于效率问题,我想避免这种情况)
我需要先序列化为数组而不是文件吗? (我希望不是 .. 因为这意味着由于 mallocated 数组而事先知道我所有结构的大小——这意味着需要额外的工作来为每个非简单结构创建一个函数来知道它的大小)
注意:*大小是定义的常量
注2:DynamicArray 是指向另一个结构的指针。
【问题讨论】:
-
显而易见的事情就是读/写整个结构,
fwrite(user,sizeof *user,1,fp)你有什么理由不能这样做吗?如果您希望字段的顺序无关紧要,那就另当别论了,您需要使用某种结构化文件格式来实现这一点。 -
@nos:OP 可能没有这样做,因为
requests不应该被读取。解决方案是有两个结构,一个带有要读取的数据,一个带有这个 andrequests. 的主结构 -
在这种情况下,使用 offsetof() 宏计算结构的大小,以排除最后一个元素,而不是使用 sizeof。
-
不能做 fwrite( user, sizeof( User ), 1 fp ) 因为 requests 是指针类型...我需要使用 serializeDynamicArray 函数来序列化这些东西。
标签: c file serialization struct padding