C/C++中的非固定结构
Unfixed structure in C/C++
我有一个名为TOWRITE的结构。我想把内容和结构写进一个文件。但有一点是,结构构件的尺寸是不固定的。它取决于从另一个来源接收到的数据。有可能用简单的方法写出结构吗。请参阅下面的代码片段。
感谢
typedef struct TOWRITE
{
DWORD dwHeader;
WORD datacount;
LPBYTE lpData;
WORD checksum;
}
TOWRITE towrite;
ZeroMemory( &towrite, sizeof( TOWRITE ));
towrite.lpData = (LPBYTE) new BYTE[256];
towrite.dwHeader = 0xF1F1E1E1;
towrite.datacount = 256;
towrite.cheksum = 3849;
CopyMemory( towrite.lpData, szTemp, 256 );
.....
.....
.....
f.write( (LPBYTE)&towrite, sizeof(TOWRITE) );
....
....
....
....
typedef struct TOWRITE
{
DWORD dwHeader;
WORD datacount;
WORD checksum;
LPBYTE lpData; //Put the ptr at the end
}
// - sizeof(LPBYTE) avoid the ptr @ to be written
f.write( (LPBYTE)&towrite, sizeof(TOWRITE) - sizeof(LPBYTE));
// write the ptr data.
// sorry I don't know windows C.
// fix the size of the array element :)
f.write( towrite.lpData, towrite.datacount * sizeof(????));
您可以尝试tpl库:http://tpl.sourceforge.net/
Tpl是一个用于序列化C数据的库。数据以其自然的二进制形式存储。API很小,并试图"置身事外"。与使用XML相比,tpl在C程序中使用起来更快、更容易。Tpl可以序列化许多C数据类型,包括结构。
有可能用简单的方法写出结构吗。
我不能使用任何外部库
那么没有。无论是C的TPL还是C++的优秀Boost.Serialization,库都是的简单方法。C和C++没有用于序列化数据结构的内置机制。因此,如果您不能使用库,那么您将不得不自己编写序列化代码。
只使用两个写调用:
f.write ((LPBYTE)&towrite, sizeof(TOWRITE));
f.write ((LPBYTE)&towrite.lpData, towrite.datacount * sizeof(BYTE));
然后你可以用再次阅读
TOWRITE towrite;
f.read ((LPBYTE)&towrite, sizeof(TOWRITE));
towrite.lpData = (LPBYTE) new BYTE[towrite.datacount];
f.read ((LPBYTE)&towrite.lpData, towrite.datacount * sizeof(BYTE));
使用这种方法可以避免由于结构填充而产生的冗余数据。
char* data =malloc(sizeof(towrite)-sizeof(LPBYTE)+var_data);
CopyMemory( data, towrite.dwHeader, sizeof(DWORD) );
CopyMemory( data, towrite.datacount, sizeof(WORD) );
CopyMemory( data, szTemp, datalength);
CopyMemory( data, towrite.checksum, sizeof(WORD) );
f.write( data,sizeof(towrite)-sizeof(LPBYTE)+var_data);
我刚刚将代码修改为
typedef struct TOWRITE
{
DWORD dwHeader;
WORD datacount;
}
TOWRITE towrite;
LPBYTE lpData;
WORD checksum;
ZeroMemory( &towrite, sizeof( TOWRITE ));
lpData = (LPBYTE) new BYTE[256];
towrite.dwHeader = 0xF1F1E1E1;
towrite.datacount = 256;
cheksum = 3849;
CopyMemory( lpData, szTemp, 256 );
.....
.....
.....
f.write( (LPBYTE)&towrite, sizeof(TOWRITE) );
f.write( (LPBYTE)&lpData, datacount );
f.write( (LPBYTE)&checksum, 2 );
....
....
....
....
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 如何在C++中序列化结构数据
- std::vector的包装器,使数组的结构看起来像结构的数组
- 没有为自己的结构调用列表推回方法
- 奇怪的结构&GCC&clang(void*返回类型)
- 在 c++ 中拥有一组结构的正确方法是什么?
- vscode g++链路故障:体系结构x86_64的未定义符号
- C++概念:如何使用'concept'检查模板化结构的属性?