C++ C/C中的非固定结构++

C++ C/C中的非固定结构++,c++,c,windows,C++,C,Windows,我有一个名为TOWRITE的结构。我想把结构中的内容写入一个文件。但有一件事是结构的一个构件的大小是不固定的。这取决于从另一个来源接收的数据。用简单的方法写结构是可能的。请参考下面的代码片段 谢谢 typedef struct TOWRITE { DWORD dwHeader; WORD datacount; LPBYTE lpData; WORD checksum; } TOWRITE towrite; ZeroMemory( &towrite, sizeof

我有一个名为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) );
....
....
....
....
您可以尝试tpl库:

Tpl是一个用于序列化C数据的库。数据以自然二进制形式存储。这个API很小,并且试图避开它。与使用XML相比,tpl在C程序中更快、更容易使用。Tpl可以序列化许多C数据类型,包括结构。

您可以尝试Tpl库:

Tpl是一个用于序列化C数据的库。数据以自然二进制形式存储。这个API很小,并且试图避开它。与使用XML相比,tpl在C程序中更快、更容易使用。Tpl可以序列化许多C数据类型,包括结构

用简单的方法写结构是可能的

我不能使用任何外部库

<0 >库是简单的方法,无论是C++的TPL还是优秀的Boo.Services系列化。C和C++没有用于序列化数据结构的内置机制。因此,如果您不能使用库,那么您必须自己手工编写序列化代码

用简单的方法写结构是可能的

我不能使用任何外部库


<0 >库是简单的方法,无论是C++的TPL还是优秀的Boo.Services系列化。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));

只需使用两个写调用:

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);

使用这种方法可以避免由于结构填充而产生的冗余数据

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 );
....
....
....
....

只是我修改了我的代码

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 );
....
....
....
....

不,您只是在编写指向数据的指针,这不是很有用。您还必须写入lpData指向的数据。没有快捷方式。不,你只是在写指向数据的指针,这不是很有用。您还必须写入lpData指向的数据。没有捷径。谢谢你宝贵的回复,但我不能使用任何外部库。在这种情况下,最好是你将结构成员逐个序列化,以避免可能出现的对齐问题…谢谢你宝贵的回复,但我不能使用任何外部库在这种情况下,最好是将结构成员逐个序列化,以避免对齐可能出现的问题…sizeofTOWRITE-sizeofLPBYTE,这里是解决方案的LPByteTanks大小,受您的解决方案启发,我修改了代码并使用3 write方法编写结构,lpdata和checksumsizeofTOWRITE-SIZEOFLPYTE,这里是解决方案的LPBYTESTANK的大小,受您的解决方案的启发,我修改了代码并使用3种写入方法来写入结构、lpdata和校验和