1

TOWRITEという名前の構造があります。構造の内容をファイルに書き込みたい。ただし、構造体のメンバーのサイズが固定されていないことが1つあります。別のソースから受信したデータによって異なります。簡単な方法で構造を書くことは可能ですか?以下のコードスニペットを参照してください。

ありがとう

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

2つの書き込み呼び出しを使用するだけです。

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 に答える