0

さて、私はオブジェクトを持っています:

LivingObject* myPlayer=new LivingObject(...);

そして、終了時にファイルに書き込みたいと思います。これが私がこれまでに持っているものです:

std::fstream myWrite;
myWrite.open("Character.dat",std::ios::binary|std::ios::app);
myWrite.write((char*)myPlayer,sizeof(myPlayer));
myWrite.close();

終了時にファイルを監視しましたが、サイズはまったく増加しませんでした(書き込みがないと仮定しました)。私は何を間違えましたか?

4

3 に答える 3

1

このコードは、オブジェクト全体ではなく、オブジェクトの最初の 4 (64 ビットでは 8) バイトのみをファイルに書き込みます。オブジェクト全体を記述するには、次を使用します。

myWrite.write((char*)myPlayer,sizeof(LivingObject));

ファイルのサイズについて: 一部のオペレーティング システムは、ファイル サイズをディスク上のファイルに割り当てられた領域として報告します。これは、物理ブロック サイズの倍数です。したがって、書き込みがブロック サイズを超えて増加しない限り、ファイル サイズの増加は見られません。

于 2013-01-17T21:53:46.833 に答える
0

myPlayerへのポインタですLivingObject

myWrite.write((char*)myPlayer,sizeof(myPlayer));この行では、ポインターを別のポインターにキャストしてから、ポインター型のサイズ(通常は4)を示しています。したがって、オブジェクトではなく、4バイトのデータ(アドレス)を書き込むことになります。

したがって、代わりに、クラスをバイナリパック形式または別の形式(XML、JSONなど)にシリアル化し、それをファイルに書き込む必要があります。

于 2013-01-17T21:41:21.490 に答える
0

Web で「boost serialize」を検索します。実行している操作はシリアライゼーションと呼ばれます。

プラットフォーム間でデータを共有する場合は、バイナリ以外の形式を選択するか、形式を書き留める必要があります。どのマルチバイト量がリトル エンディアンまたはビッグ エンディアンであるかを必ず明記してください。

于 2013-01-17T21:41:36.897 に答える