我有一个名为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) );
....
....
....
....
答案 0 :(得分:3)
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(????));
答案 1 :(得分:1)
您可以尝试使用tpl库:http://tpl.sourceforge.net/
Tpl是一个用于序列化C数据的库。数据以其自然二进制形式存储。 API很小,并试图保持“不碍事”。与使用XML相比,tpl在C程序中使用更快,更容易。 Tpl可以序列化许多C数据类型,包括结构。
答案 2 :(得分:1)
是否可以通过简单的方式编写结构。
我不能使用任何外部库
然后没有。库是的简单方法,无论是TPL for C还是优秀的Boost.Serialization for C ++。 C和C ++没有用于序列化数据结构的内置机制。因此,如果您无法使用库,那么您将不得不自己手动编写序列化代码。
答案 3 :(得分:1)
只需使用两个写调用:
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));
答案 4 :(得分:0)
使用这种方法可以避免有时因结构填充而产生的冗余数据。
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);
答案 5 :(得分:0)
我修改了我的代码
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 );
....
....
....
....