[C]-Struktury, obsługa plików

0

Mam takie zadanie do zrobienia i się chce zapytać czy dobrze to zrobiłem.

Proszę rozszerzyć program o następujące funkcje:

  • zapis i odczyt całego magazynu w trybie binarnym

  • funkcja zwalniająca pamięć przydzieloną na towary w magazynie. Funkcja jednocześnie usuwa wszystkie towary z magazynu.

To jest ten program

#include <cstdio>
#include <cstring>

struct Towar {
    char nazwa[ 32 ];
    float cena;
    float cena_jednostkowa;
};

void ustaw( Towar * t, const char n[], float cena, float cj ) {
    strcpy( t->nazwa, n );
    t->cena = cena;
    t->cena_jednostkowa = cj;
}
struct Magazyn {
    int stan;
    Towar * towary[ 1000 ];
};

void init( Magazyn * m ) {
    m->stan = 0;
    for( int i = 0; i < 1000; ++i )
         m->towary[ i ] = 0;
   
}

Towar * utworz( const char n[], float cena, float cj ) {
    Towar * t = new Towar;
    ustaw( t, n, cena, cj );
    return t;
}

bool dodaj( Magazyn * m, const char n[], float cena, float cj ) {
    if( m->stan >= 1000 )
    {
        return false;
    }
    m->towary[ m->stan++ ] = utworz( n, cena, cj );
    return true;
}

void wypisz( Magazyn * m, FILE * fp ) {
    fprintf( fp, "%d\n", m->stan );
    for( int i = 0; i < m->stan; ++i )
         wypisz( m->towary[ i ], fp );
   
}

void wczytaj( Magazyn * m, FILE * fp ) {
    fscanf( fp, "%d", & m->stan );
    getc( fp );
    for( int i = 0; i < m->stan; i++ )
    {
        m->towary[ i ] = new Towar;
        wczytaj( m->towary[ i ], fp );
    }
}

A tutaj napisałem te funkcje

void wypiszbinarnie( Magazyn * m, FILE * fp ) {
    fwrite( &( m->stan ), sizeof( int ), 1, fp );
    for( int i = 0; i < m->stan; ++i )
         fwrite( m->towary[ i ], sizeof( Towar ), 1, fp );
   
}

void wczytajbinarnie( Magazyn * m, FILE * fp ) {
    fread( &( m->stan ), sizeof( int ), 1, fp );
    for( int i = 0; i < m->stan, i++ )
         fread( m->towary[ i ], sizeof( Towar ), 1, fp );
   
}

bool usun( Magazyn * m, int numerTowaru ) {
   
    if( numerTowaru < 0 or numerTowaru >= m->stan ) return 0;
   
    if( numerTowaru < m->stan - 1 )
         m->towary[ numerTowaru ] = m->towary[ m->stan - 1 ];
   
    m->stan--;
    return 1;
}
0
  1. Program podstawowy korzysta z przeładowania nazw funkcji, więc Twoje funkcje wypiszbinarnie i wczytajbinarnie powinny mieć takie prototypy:
void wypisz( const Towar *t, FILE *fp );
void wczytaj( Towar *t, FILE *fp );

i zapisywać/odczytywać tylko jeden towar.

  1. W wyżej wymienionych funkcjach niepotrzebnie powtarzasz zapis/odczyt stanu magazynu.

  2. Według treści zadania funkcja usun ma usuwać wszystkie towary z magazynu, więc po co Ci jakiś numerTowaru?

1 użytkowników online, w tym zalogowanych: 0, gości: 1