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数据类型,包括结构。

是否可以通过简单的方式来编写结构?

我不能使用任何外部库

那就不要。 无论TPL for C还是优秀的Boost.Serialization for C ++,库都是简单的方法。 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 ); .... .... .... ....