2016-04-13 33 views
0

Oluşturduğum bazı yapıları bir ikili dosyadan yazmak/okumak zorundayım, ancak onları tekrar okurken bazı kötü hatalar alıyorum. Bu yapı, örneğinDiğer yapıları içeren ikili dosyadan yapıları okuma ve yazma (C)

Al:

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

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

Ve şimdi, MAĞAZA bir dizi oluşturabilir ve olduğu gibi (her MAĞAZA [i] için, ITEM bir dinamik dizi oluşturma) her şeyi doldurmak, ama ben emin değilim:

fwrite(); aslında tüm dizi, ITEM için doldurulmuş tüm bilgi ile yazıyor ve ben fread() kullandığınızda bazı erişim ihlali hatası verir.

G/Ç için .txt dosyalarının kullanılması dışında, doğru yaklaşım ne olurdu. Yapıyı yazmak istiyorsanız http://pastebin.com/79TtvQ9t

+1

"fwrite(); aslında tüm dizi ITEM için doldurulmuş tüm bilgi ile yazıyor ". Hayır yok - sadece tam işaretçi değerini yazar. Dizi içeriğini ayrı ayrı yazmanız gerekir. – kaylum

+0

Yani doğru bir yaklaşım Bir seferde 1 SHOP + ITEM dizisi yazınız mı? – AleksXPO

cevap

0

sorun bu

21 karakter gibi bir şey bitmeli dosyaya işaretçiyi, yazıyoruz ki -> char dizi "adıyla gelen "yapı dükkandan

4 byte -> numOfItems int gelen

4 byte -> pointer gelen

, böylece yapı bu

gibi bir şey haline gelmelidir arr için

21 karakter dosyasında buna benzer bir şey olması sona ereceğini

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

-> yapı dükkandan char dizi "isim" gelen

4 byte -> numOfItems

int gelen

21 karakter -> yapı öğeleri

21 karakter gelen karakter dizisi "isim" gelen -> yapı öğeleri

gelen karakter dizisi "güç" gelen

4 byte -> int stokunun gelen

8 byte -> çift fiyata gelen

bayt 2 bayt olan bazı PC'ler int (uygulamanızı çalıştırdığınız PC bağlı olarak değişebilir diğerleri, 4, vb.)

0

, bu işaretçi feilds olmamalıdır: Burada

bir kod örneğidir. Bu durumda, yapıya göre yazmamalısınız. bu sadece bir işaretçi alanı için bir adres yazmak Çünkü