2011-07-21 4 views
4

私は文字列を含む構造体を持っています。そのような何か:STL文字列にfread/fwriteを使用しています。それが正しいか?

struct Chunk { int a; string b; int c; };

だから、私は、関数freadとfwriteの機能を使用してファイルからこの構造体を読み書きすることができない、と仮定します。 stringは異なるメモリ容量を予約する可能性があるためです。 しかし、そのようなコードは正しく動作します。

Chunk var;

fwrite(&var, sizeof(Chunk), 1, file);

fread(&var, sizeof(Chunk), 1, file);

本当にそれでいくつかの問題がありますか?

答えて

8

あなたはこれを疑うことが正当です。 fwritefreadおよびstringでストリームPODタイプはPODではありません。

+4

これに加えて、ポインタはPODですが、通常はよくシリアル化されません。 –

+0

ありがとう@ベン、私の用語は緩いです。 –

+3

また、PODタイプのアラインメントには注意が必要です。 'struct s {uint8_t c; uint64_t d}; '' sizeof(struct s) 'はおそらく9ではありません。 – user786653

2

異なる実装ではstd::stringという異なる構造が使用されるため、このようにしないでください。

一般に、整数型、ブール型、バイナリデータ(シリアル化と呼ぶことができる場合)のみを直列化する必要があります。プラットフォーム間でシリアル化されたデータを共有する場合は、必ず1つのエンディアンを使用してください。

フロート、ダブル、ポインタで気をつけてください。彼らは非常に厄介になることがあります。

C/C++の構造体には、予想外の量のパディングが含まれている可能性があるので、注意する必要があります。

+0

予測できない量のパディングが含まれているので、構造体も問題になります。あなたが書いているのと同じプログラムとプロセスでデータを読んでも問題ありませんが、それは絶対に移植性がありません。構造体メンバを再帰的に個別にシリアル化する必要があります。 –

+0

@Kerrek SB:いいです、私はそれを編集します。 – orlp

関連する問題