2016-11-27 10 views
0

私は構造体を持っています。私は、この構造体の配列を持っているし、バイナリファイルにこれを書いて、それを読んでみたいです。ただし、この配列は動的に割り当てられる必要があります。私はこれにどのように接近すべきか分かりません。私の現在の推測では、このです:バイナリファイルから構造体に動的に割り当てられた配列を読み込みます。

私はこのようなファイルへの構造体を作成し、次に定義すると:

struct map { 
    int *tiles; 
}; 

int main() { 

    map sample; 

    sample.tiles = new int[2]; 

    sample.tiles[0]=1; 
    sample.tiles[1]=2; 

    ofstream file("sample.data", ios::binary); 

    file.write((char *)&sample, sizeof(sample)); 

    file.close(); 

    return 0; 
} 

その後、別のプログラムでは、このようにそれを読む:私はしたいとき

map test; 
ifstream file("sample.data", ios::binary); 
file.read((char *)&test, sizeof(test)); 

cout << test.tiles[0]; 

で結果を確認し、私は不気味膨大な数の、しかしはっきりではない、私はORIG番号を取得インラインでファイルに書きました。

これを行う正しい方法は何ですか?アレイの大きさを知らずにアレイを読み取るにはどうすればよいですか?

+1

まず、あなたの構造体に別の名前を付けると、 'std :: map'と衝突する可能性があります。 – kebs

+1

size()は動作しません。コンパイル時の演算子です。サイズを事前に把握していない場合は、そのようなベクターなどのstdコレクションを使用してください。 – OldProgrammer

+1

ちなみに、あなたのコードはここでメモリをリークしています(書き込み中)、初期化されていないメモリにアクセスしています(読み込み中)。 [3/5/0のルール](http://stackoverflow.com/documentation/c%2b%2b/1206/the-rule-of-three-five-and-zero)を読んで、あなたのデザインを再設計してください。構造体、おそらく 'std :: unique_ptr ' – wasthishelpful

答えて

3
file.write((char *)&sample, sizeof(sample)); 

これは、ファイルに次のような構造を書き込みます

ある
struct map { 
    int *tiles; 
}; 

、単一のポインタを含む構造体。ポインタはメモリ内のアドレスです。だから、あなたがファイルに書き込むのは、意味のない生のメモリアドレスです。

明らかに、それは後で読み返しても絶対に使用されません。まもなく終了したプログラムでは、あなたの整数をあなたのファイルに書き込まなかっただけで、メモリ内のアドレスはどうだったのでしょうか?

これを正しく行うためには、あなたがする必要があります。

  1. inttilesポインタが指している-egersどのように多くのレコード。

  2. fwrite()構造自体ではなく、tilesポインタが指している整数です。

また、この配列にいくつの整数があるかをファイルに書き込む必要があります。ファイルにこれらの整数だけが含まれている場合は、ファイルの内容全体を読み込むだけで済みますので、実際には必要ありません。しかし、ファイルにいくつかの追加データを書き込む予定がある場合は、書かれた配列のサイズをファイル自体に記録することが明らかに必要になりますので、読み込んだときの整数の数を調べることができますバック。これを行う最も簡単な方法は、最初に配列のサイズであるintを1つ書き、その後に配列自体の内容を書き込むことです。逆の処理を行い、すべてを読み返します。

+0

私はあなたのアドバイスを取った、構造体を格納する代わりに、今は配列のサイズと配列自体をファイルに書きます。 – Letokteren

1

sampleオブジェクトには、ポインタtilesが含まれています。ポインタ値はファイルに書き込んでいます。あなたが書きたいものは、ポインタが指しているものです。 あなたの例では、file.write(sample.tiles, 2*sizeof(*sample.tiles));をしたいと思うでしょう。 new int[2]を行ったので、2*です。一般的には、ファイル内にサイズ(この場合は2)を保存して、読み込むintの数を知ることができます。この単純なケースでは、ファイルのサイズから2を推測することができます。

関連する問題