1

我有一个名为 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) );
....
....
....
....
4

6 回答 6

4
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(????));  
于 2012-08-25T11:52:19.090 回答
1

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

我不能使用任何外部库

那就不要。无论是用于 C 的 TPL 还是用于 C++ 的出色的 Boost.Serialization,库都是最简单的方法。C 和 C++ 没有用于序列化数据结构的内置机制。因此,如果您无法使用库,那么您将不得不自己手动编写序列化代码。

于 2012-08-25T11:50:48.657 回答
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));
于 2012-08-25T11:51:13.007 回答
1

您可以尝试 tpl 库:http ://tpl.sourceforge.net/

Tpl 是一个用于序列化 C 数据的库。数据以其自然二进制形式存储。API 很小,并试图保持“不碍事”。与使用 XML 相比,tpl 在 C 程序中使用起来更快、更容易。Tpl 可以序列化许多 C 数据类型,包括结构。

于 2012-08-25T11:44:18.403 回答
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);
于 2012-08-25T12:05:52.307 回答
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 );
....
....
....
....
于 2012-08-25T12:11:50.560 回答