我必须将结构数据数组写入硬盘:
struct Data {
char cmember;
/* padding bytes */
int imember;
};
据我所知,大多数编译器会在 Data 的 cmember 和 imember 成员之间添加一些填充字节,但我只想保存到文件的实际数据(没有填充)。
我有下一个用于保存 Datas 数组的代码(为了简化,在缓冲区而不是文件中):
bool saveData(Data* data, int dataLen, char* targetBuff, int buffLen)
{
int actualLen = sizeof(char) + sizeof(int); // this code force us to know internal
// representation of Data structure
int actualTotalLen = dataLen * actualLen;
if(actualTotalLen > buffLen) {
return false;
}
for(int i = 0; i < dataLen; i++) {
memcpy(targetBuff, &data[i].cmember, sizeof(char));
targetBuff += sizeof(char);
memcpy(targetBuff, &data[i].imember, sizeof(int));
targetBuff += sizeof(int);
}
return true;
}
如您所见,我使用以下代码计算数据结构的实际大小:
int actualLen = sizeof(char) + sizeof(int)
。还有其他选择吗? (类似于 int actualLen = actualSizeof(Data)
)
附言这是综合示例,但我认为您理解我的问题的想法...
最佳答案
只需一次保存结构的每个成员。如果重载 << 以将变量写入文件,则可以
myfile << mystruct.member1 << mystruct.member2;
然后你甚至可以重载 << 以获取整个结构,并在结构的运算符 << 中执行此操作,所以最后你有:
myfile << mystruct;
生成的保存代码如下所示:
myfile << count;
for (int i = 0; i < count; ++i)
myFile << data[i];
在我看来,如果您可以通过这种方式来处理内存地址和 memcpy,那将是一件令人头疼的事情。这种通用技术称为序列化 - 访问 google 了解更多信息,这是一个成熟的领域。
关于c++ - 结构成员的实际总大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1631425/