2016-04-13 34 views
0

私が作成した構造体をバイナリファイルから読み書きする必要がありますが、それらを読み込むと面倒なエラーが発生します。他の構造体を含むバイナリファイルから構造体を読み込んで読み込む(C)

例えば、この建設ください:

typedef struct items 
{ 
    char name[21], power[21]; 
    int stock; 
    double price; 
} ITEMS; 

typedef struct shop 
{ 
    char name[21]; 
    int numOfItems; 
    ITEMS *arr; 
} SHOP; 

をそして今、私はSHOPの配列を作成しているとして、すべてを埋めることができます(各SHOP用ITEMための動的配列を作成、[i])と、私次の場合はわかりません:

fwrite();実際には全体の配列を書き込み、ITEMの のために記入されたすべての情報を使用し、fread()を使用するとアクセス違反エラーが発生します。

I/Oに.txtファイルを使用する以外に、正しいアプローチは何でしょうか。ここで

は、コードサンプルです:http://pastebin.com/79TtvQ9t

+1

"確かにfwrite();実際には、ITEMに記入されているすべての情報を配列全体に書き込む」ということではなく、正確なポインタ値を書いているだけで、配列の内容を別に書く必要があります。 – kaylum

+0

正しいアプローチは、一度に1 SHOP + ITEMアレイを書きますか? – AleksXPO

答えて

0

問題は、あなたがこの

21文字のようなもので終わらなければならないファイルへのポインタを、書いているということである - >はchar型の配列「の名前から来て「構造体のショップから

4バイト - > numOfItems

4バイトのintから来る - >そう

をARRへのポインタから、あなたの構造体は、この

のようなものになるはずです>構造体の店からchar配列 "名" から来

4バイト - - > numOfItems

int型からのファイルでこれに似たような

21文字を持つ終わるだろう

typedef struct shop 
{ 
    char name[21]; 
    int numOfItems; 
    ITEMS arr; 
} SHOP; 

21文字 - >構造体アイテム

21文字から文字列「名前」から来る - 構造体アイテム

からchar配列「パワー」から来ます>

4バイト - > int型の在庫から来

8バイト - >ダブル価格から来る

バイトは2つのバイトを持っているあなたには、いくつかのPCのint型に(あなたのアプリケーションを実行しているPCによって異なる場合があります、他4など)

0

あなたが構造を書きたい場合は、それがポインタfeildsを持つべきではありません。この場合、構造単位で書くべきではありません。それだけでポインタフィールドのアドレスを書き込むので

関連する問題