cyb*_*vnm 3 c c++ data-structures
我必须将struct Data数组写入硬盘:
struct Data {
char cmember;
/* padding bytes */
int imember;
};
AFAIK,大多数编译器会在数据的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;
}
如您所见,我使用代码计算Data struct的实际大小:int actualLen = sizeof(char) + sizeof(int).有没有替代方案?(像int actualLen = actualSizeof(Data))
PS这是合成的例子,但我想你理解我的问题...
只需保存一个结构的每个成员一次.如果重载<<将变量写入文件,则可以
myfile << mystruct.member1 << mystruct.member2;
Run Code Online (Sandbox Code Playgroud)
然后你甚至可以重载<<来获取整个结构,并在结构的运算符<<中执行,所以最后你有:
myfile << mystruct;
Run Code Online (Sandbox Code Playgroud)
导致保存代码看起来像:
myfile << count;
for (int i = 0; i < count; ++i)
myFile << data[i];
Run Code Online (Sandbox Code Playgroud)
IMO所有那些摆弄内存地址和memcpy的东西,当你可以这样做的时候太麻烦了.这种通用技术称为序列化 - 谷歌更多,它是一个发展良好的领域.
| 归档时间: |
|
| 查看次数: |
1452 次 |
| 最近记录: |