Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C] - Odczytywanie z pliku do struktury

Ostatnio zmodyfikowano 2014-01-31 17:41
Autor Wiadomość
Plachu
Temat założony przez niniejszego użytkownika
[C] - Odczytywanie z pliku do struktury
» 2014-01-30 16:34:36
Witam, muszę napisać program realizujący kase fiskalną, kompilator wyrzuca mi takie o to błędy:

error LNK2019: unresolved external symbol _wyswietlzakupy referenced in function _trybkasy
error LNK2019: unresolved external symbol _wyswietlprodukt referenced in function _trybkasy
error LNK1120: 2 unresolved externals

Jako,że dopiero uczę się programować, próbowałem poszukać w internecie jakiś wskazówek ale niestety nie mogę dojść co mi nie działa, jeżeli znalazłaby się osoba, która wskaże mi błąd i objaśni jak go w przyszłości uniknąć byłbym bardzo wdzięczny, z góry dziękuje i pozdrawiam!:)

C/C++
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>

struct produkt * wczytaj();
void zapisz( struct zakupione * kupno );
struct zakupione * trybkasy( struct produkt * zakupy );
void wyswietlprodukt( struct produkt * zakupy );
void wyswietlzakupy( struct zakupione * kupno );
void oczysc( struct zakupione * kupno );
struct produkt * przydzielpamiecpoduktu( struct produkt * kupno, int val );
struct zakupione * przydzielpamieczakupiona( struct zakupione * kupno, int val );
void oczysc1( struct produkt * produkty );


int main()
{
    struct produkt * nowy = NULL;
    struct zakupione * nowe = NULL;
    setlocale( LC_ALL, "polish" );
    printf( "Witaj!" );
    nowy = wczytaj();
    nowe = trybkasy( nowy );
    zapisz( nowe );
    oczysc( nowe );
    oczysc1( nowy );
    return 0;
}
struct produkt
{
    char * nazwaproduktu;
    unsigned short * kodproduktu;
    float * cenaproduktu;
    char * oznaczenie;
    int ilosc;
};
struct zakupione
{
    char * nazwaproduktu;
    unsigned short * kodproduktu;
    float * cenaproduktu;
    float cena;
    float podatek;
    float reszta;
    int ilosc;
};
struct zakupione * trybkasy( struct produkt * zakupy )
{
    struct zakupione * tmp = NULL;
    unsigned short kod;
    int a, i = 0, j = 0, spr, spr3, sztuka;
    float waga, cena, spr1, kwota;
    printf( "Oto lista dostępnych artykułów" );
    wyswietlprodukt( zakupy );
    for(;; )
    {
        printf( "Podaj kod produktu:\n" );
        a = scanf( "%hu", & kod );
        while( !a )
        {
            printf( "Wpisałeś błędny kod! Podaj jeszcze raz!:\n" );
            a = scanf( "%hu", & kod );
        }
       
        for( i = 0; i <= zakupy->ilosc; i++ )
        {
            if( i == zakupy->ilosc )
            {
                printf( "Podałeś błędny kod! Wprowadź jeszcze raz:\n" );
                a = scanf( "%hu", & kod );
                while( !a )
                {
                    printf( "Wpisałeś błędny kod! Podaj jeszcze raz!:\n" );
                    a = scanf( "%hu", & kod );
                }
                i = 0;
            }
            if( zakupy->kodproduktu[ i ] == kod )
            {
                printf( "Podałeś poprawny kod!" );
                break;
            }
        }
        tmp = przydzielpamieczakupiona( tmp, j );
        if( tmp == NULL )
        {
            printf( "Błąd przydzielania pamięci!\n" );
            return 0;
        }
        for( i = 0; i < zakupy->ilosc; i++ )
        {
            if( zakupy->kodproduktu[ i ] == kod )
            {
                printf( "Wybrałeś:%s\nCenaproduktu to:%f\n", zakupy->nazwaproduktu[ i ], zakupy->cenaproduktu[ i ] );
                if( zakupy->oznaczenie[ i ] == 'S' )
                {
                    printf( "Podaj ilość sztuk:\n" );
                    spr = scanf( "%d", & sztuka );
                    while( spr == 0 || sztuka < 0 )
                    {
                        printf( "Wprowadziłeś błędne dane!Podaj jeszcze raz:\n" );
                        spr = scanf( "%d", & sztuka );
                    }
                    cena = sztuka *( zakupy->cenaproduktu[ i ] );
                    tmp->cena = cena +( tmp->cena );
                    tmp->nazwaproduktu[ j ] = zakupy->nazwaproduktu[ i ];
                    tmp->cenaproduktu[ j ] = zakupy->cenaproduktu[ i ];
                    tmp->kodproduktu[ j ] = zakupy->kodproduktu[ i ];
                    j++;
                    break;
                }
                if( zakupy->oznaczenie[ i ] == 'W' )
                {
                    printf( "Podaj wagę:\n" );
                    spr1 = scanf( "%f", & waga );
                    while( spr1 == 0 || waga < 0 )
                    {
                        printf( "Wprowadziłeś błędne dane!Podaj jeszcze raz:\n" );
                        spr = scanf( "%f", & waga );
                    }
                    cena = waga *( zakupy->cenaproduktu[ i ] );
                    tmp->cena = cena +( tmp->cena );
                    tmp->nazwaproduktu[ j ] = zakupy->nazwaproduktu[ i ];
                    tmp->cenaproduktu[ j ] = zakupy->cenaproduktu[ i ];
                    tmp->kodproduktu[ j ] = zakupy->kodproduktu[ i ];
                    j++;
                    break;
                }
            }
        }
        printf( "Aby wybrać kolejny produkt wciśnij dowolną cyfrę, aby przerwać kupowanie wciśnij dowolną literę:\n" );
        spr = scanf( "%d", & spr3 );
        if( !spr )
             break;
       
    }
    printf( "Podaj kwotę otrzymaną od klienta w celu wydania reszty:\n" );
    spr = scanf( "%f", & kwota );
    while( spr == 0 || kwota < 0 || kwota -( tmp->cena ) < 0 )
    {
        printf( "Kwota została błędnie wprowadzona!Wprowadź jeszcze raz!" );
        spr = scanf( "%f", & kwota );
    }
    tmp->reszta = kwota -( tmp->cena );
    tmp->podatek = 0.23 *( tmp->cena );
    tmp->ilosc = j;
    wyswietlzakupy( tmp );
    zapisz( tmp );
    return tmp;
}
struct zakupione * przydzielpamieczakupiona( struct zakupione * kupno, int val )
{
    struct zakupione * ptr;
   
    ptr->nazwaproduktu =( char * ) realloc(( kupno->nazwaproduktu ),( val + 1 ) * sizeof( char ) );
    if( ptr->nazwaproduktu == NULL )
    {
        printf( "Błąd przydzielania pamięci!" );
        return 0;
    }
    ptr->kodproduktu =( unsigned short * ) realloc(( kupno->kodproduktu ),( val + 1 ) * sizeof( unsigned short ) );
    if( ptr->cenaproduktu == NULL )
    {
        printf( "Błąd przydzielania pamięci!" );
        free( ptr->nazwaproduktu );
        return 0;
    }
    ptr->cenaproduktu =( float * ) realloc(( kupno->cenaproduktu ),( val + 1 ) * sizeof( float ) );
    if( ptr->cenaproduktu == NULL )
    {
        printf( "Błąd przydzielania pamięci!" );
        free( ptr->cenaproduktu );
        free( ptr->nazwaproduktu );
        return 0;
    }
    return( ptr );
}
struct produkt * przydzielpamiecproduktu( struct produkt * kupno, int val )
{
    struct produkt * prt = NULL;
    prt->nazwaproduktu =( char * ) realloc(( kupno->nazwaproduktu ),( val + 1 ) * sizeof( char ) );
    if( prt->nazwaproduktu == NULL )
    {
        printf( "Błąd przydzielania pamięci!" );
        return 0;
    }
    prt->kodproduktu =( unsigned short * ) realloc(( kupno->kodproduktu ),( val + 1 ) * sizeof( unsigned short ) );
    if( prt->kodproduktu == NULL )
    {
        printf( "Błąd przydzielania pamięci!" );
        free( prt->nazwaproduktu );
        return 0;
    }
    prt->cenaproduktu =( float * ) realloc(( kupno->cenaproduktu ),( val + 1 ) * sizeof( float ) );
    if( prt->cenaproduktu == NULL )
    {
        printf( "Błąd przydzielania pamięci!" );
        free( prt->nazwaproduktu );
        free( prt->kodproduktu );
        return 0;
    }
    prt->oznaczenie =( char * ) realloc(( kupno->oznaczenie ),( val + 1 ) * sizeof( char ) );
    if( prt->oznaczenie == NULL )
    {
        printf( "Błąd przedzielania pamięci!" );
        free( prt->cenaproduktu );
        free( prt->kodproduktu );
        free( prt->nazwaproduktu );
        return 0;
    }
    return( prt );
}
struct produkt * wczytaj()
{
    struct produkt * tmp = NULL;
    int mem_size = 0;
    FILE * plik;
    int i = 0;
    plik = fopen( "produkty.csv", "rt" );
    if( plik == NULL )
    {
        printf( "Błąd otwarcia pliku!\n" );
        return 0;
    }
    tmp = przydzielpamiecproduktu( tmp, mem_size );
    if( tmp == NULL )
    {
        printf( "Pamięć błędnie przydzielona!" );
        fclose( plik );
        oczysc1( tmp );
        return 0;
    }
    mem_size++;
    while(( fscanf( plik, "%s;%hu%;%f;%c", tmp->nazwaproduktu[ i ], tmp->kodproduktu[ i ], tmp->cenaproduktu[ i ], tmp->oznaczenie[ i ] ) ) == 4 )
    {
        if( tmp->oznaczenie[ i ] != 'S' || tmp->oznaczenie[ i ] != 'W' )
        {
            printf( "Błędne oznaczenie ilości/wagi!\n" );
            return 0;
        }
        tmp = przydzielpamiecproduktu( tmp, mem_size );
        if( tmp == NULL )
        {
            printf( "Pamięć błędnie przydzielona!\n" );
            fclose( plik );
            oczysc1( tmp );
            return 0;
        }
        mem_size++;
        i++;
    }
    tmp->ilosc =( i );
    fclose( plik );
    printf( "Produkty zostały pomyślnie wczytane!\n" );
    return( tmp );
}
void zapisz( struct zakupione * kupno )
{
    FILE * plik;
    int i = 0;
    plik = fopen( "zakupione.csv", "wt" );
    if( plik == NULL )
    {
        printf( "Błąd otwarcia pliku!\n" );
        return;
    }
    for( i = 0; i <( kupno->ilosc ); i++ )
         fprintf( plik, "%s;%hu;%f\n", kupno->nazwaproduktu[ i ], kupno->kodproduktu[ i ], kupno->cenaproduktu[ i ] );
   
    fprintf( plik, "%f\n;%f\n;%f\n", kupno->cena, kupno->reszta, kupno->podatek );
    printf( "Paragon został pomyślnie zapisany!\n" );
    fclose( plik );
}
void wyswietlprodukt( struct produkt * zakupy )
{
    int i;
    printf( "Oto lista produktów:\n" );
    for( i = 0; i <( zakupy->ilosc ); i++ )
         printf( "%s %hu %f\n", zakupy->nazwaproduktu[ i ], zakupy->kodproduktu[ i ], zakupy->cenaproduktu[ i ] );
   
    printf( "Produkty zostały wyświetlone!\n" );
}
void wyswietlzakupy( struct zakupione * kupno )
{
    int i;
    printf( "Oto paragon:\n" );
    for( i = 0; i <( kupno->ilosc ); i++ )
         printf( "%s %hu %f\n", kupno->nazwaproduktu[ i ], kupno->kodproduktu[ i ], kupno->cenaproduktu[ i ] );
   
    printf( "Cena:%fzł\nPodatek:%fzł\nReszta:%fzł\n", kupno->cena, kupno->podatek, kupno->reszta );
    printf( "Paragon został wyświetlony\n" );
}
void oczysc( struct zakupione * kupno )
{
    if( kupno == NULL )
         return;
   
    if( kupno->nazwaproduktu != NULL )
         free( kupno->nazwaproduktu );
   
    if( kupno->cenaproduktu != NULL )
         free( kupno->cenaproduktu );
   
    if( kupno->kodproduktu != NULL )
         free( kupno->kodproduktu );
   
    free( kupno );
}
void oczysc1( struct produkt * produkty )
{
    if( produkty == NULL )
         return;
   
    if( produkty->nazwaproduktu != NULL )
         free( produkty->nazwaproduktu );
   
    if( produkty->cenaproduktu != NULL )
         free( produkty->cenaproduktu );
   
    if( produkty->kodproduktu != NULL )
         free( produkty->kodproduktu );
   
    free( produkty );
}
P-103608
oputyk
» 2014-01-30 16:38:55
Chodzi o błąd linkera. W pliku nagłówkowym musisz napisać deklaracje funkcji, a w pliku cpp ich definicje. A jeśli chodzi o zabezpieczenie przed powtórną definicją, to piszesz ją w ten sposób:
C/C++
#ifndef nazwa_h_
#define nazwa_h_
//kod
#endif
P-103609
Plachu
Temat założony przez niniejszego użytkownika
» 2014-01-30 17:02:08
Szczerze mówiąc to nie łapie.. Przecież na samym początku mam deklaracje, a potem znajdują się definicje? Mógłbyś tak jaśniej, jak dla laika ?:)


edit// już mam ale pojawiły się kolejne błędy,zobaczymy czy dam radę :) - w nazwie funkcji była literówka
P-103620
oputyk
» 2014-01-30 18:43:28
Po prostu w pliku -
nazwa.h
 dajesz deklaracje, czyli coś takiego -
int funkcja( int argument );
, a w pliku
nazwa.cpp
 dajesz definicję, czyli cały blok z instrukcjami, które mają się znaleźć w funkcji.
P-103628
pekfos
» 2014-01-30 18:59:29
Ej no, miało być dla laika ;) Mieszasz o nagłówkach, podczas gdy problem polega na tym, że nazwy funkcji się nie zgadzają. Zadeklarowana jest funkcja wyswietlzakupy(), taka jest używana, a definicji nie ma. Zdefiniowana jest funkcja wyswietlzakupione().
P-103631
Plachu
Temat założony przez niniejszego użytkownika
» 2014-01-30 23:59:42
Poprawiłem bo znalazłem parę innych błędów, tylko teraz mam problem z funkcjami do przydzielania pamięci, skoro chcę do tych tablic przydzielić pamięć dynamicznie to muszę je mieć z **? Program zatrzymuje się już przy przydzielpamiecproduktu pokazując błąd przy prt - "nazwaproduktu = CXX0030: Error: expression cannot be evaluated" :)

poprawiony kod wkleiłem u góry :)
P-103661
stryku
» 2014-01-31 05:38:38
Mi się wydaje, że jak wywołasz realloc dla nazwaproduktu to on to przepisze, ale zwolni pamięć od razu potem i nie bd miał jak się odwołać do niej już. Nie wiem czy dobrze myślę, jak nie to niech ktoś mądrzejszy poprawi
Albo Ty próbujesz zwalniać pamięć
free( prt->nazwaproduktu );
 a realloc sam już ją zwalnia
P-103668
Plachu
Temat założony przez niniejszego użytkownika
» 2014-01-31 17:41:42
naprawiłem kolejne pare rzeczy, program już się uruchamia tylko nie chce nic wczytać z pliku, pomoże ktoś? nie wchodzi w ogóle do pętli while w funkcji wczytaj :)

C/C++
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>

struct produkt * wczytaj();
void zapisz( struct zakupione * kupno );
struct zakupione * trybkasy( struct produkt * zakupy );
void wyswietlprodukt( struct produkt * zakupy );
void wyswietlzakupy( struct zakupione * kupno );
void oczysc( struct zakupione * kupno );
struct produkt * przydzielpamiecproduktu( int val );
struct zakupione * przydzielpamieczakupiona( int val );
void oczysc1( struct produkt * produkty );

int main()
{
    struct produkt * nowy;
    struct zakupione * nowe;
    int spr, a;
    setlocale( LC_ALL, "polish" );
    nowy = wczytaj();
    printf( "Witaj!\nWybierz czynność:1.Wyświetlenie produktów\n2.Tryb kasy\n3.Jeśli chcesz wyjść wciśnij dowolną literę\nPodaj cyfrę:" );
    while( scanf( "%d", & spr ) == 1 )
    {
        while( spr > 3 || spr < 1 )
        {
            printf( "Wprowadziłeś błędną cyfrę, wprowadź jeszcze raz!\n Podaj cyfrę:" );
            a = scanf( "%dwhile", & spr );
        }
        if( spr == 1 )
        {
            printf( "Wybrałeś wyświetlenie!\n" );
            wyswietlprodukt( nowy );
        }
        if( spr == 2 )
        {
            nowe = trybkasy( nowy );
            oczysc( nowe );
        }
        if( spr == 3 )
        {
            if( nowe != NULL )
                 oczysc( nowe );
           
            if( nowy != NULL )
                 oczysc1( nowy );
           
            printf( "Żegnaj!" );
        }
        printf( "Witaj!\nWybierz czynność:1.Wyświetlenie produktów\n2.Tryb kasy\n3.Wyjście(lub podanie litery)\nPodaj cyfrę:" );
    }
    if( nowe != NULL )
         oczysc( nowe );
   
    if( nowy != NULL )
         oczysc1( nowy );
   
    printf( "Żegnaj!" );
    return 0;
}
struct produkt
{
    char * nazwaproduktu;
    unsigned short * kodproduktu;
    float * cenaproduktu;
    char * oznaczenie;
    int ilosc;
};
struct zakupione
{
    char * nazwaproduktu;
    unsigned short * kodproduktu;
    float * cenaproduktu;
    float cena;
    float podatek;
    float reszta;
    int ilosc;
};
struct zakupione * trybkasy( struct produkt * zakupy )
{
    struct zakupione * tmp = NULL;
    unsigned short kod;
    int a, i = 0, j = 0, spr, spr3, sztuka;
    float waga, cena, spr1, kwota;
    printf( "Oto lista dostępnych artykułów" );
    wyswietlprodukt( zakupy );
    for(;; )
    {
        printf( "Podaj kod produktu:\n" );
        a = scanf( "%hu", & kod );
        while( !a )
        {
            printf( "Wpisałeś błędny kod! Podaj jeszcze raz!:\n" );
            a = scanf( "%hu", & kod );
        }
       
        for( i = 0; i <= zakupy->ilosc; i++ )
        {
            if( i == zakupy->ilosc )
            {
                printf( "Podałeś błędny kod! Wprowadź jeszcze raz:\n" );
                a = scanf( "%hu", & kod );
                while( !a )
                {
                    printf( "Wpisałeś błędny kod! Podaj jeszcze raz!:\n" );
                    a = scanf( "%hu", & kod );
                }
                i = 0;
            }
            if( zakupy->kodproduktu[ i ] == kod )
            {
                printf( "Podałeś poprawny kod!" );
                break;
            }
        }
        tmp = przydzielpamieczakupiona( j );
        if( tmp == NULL )
        {
            printf( "Błąd przydzielania pamięci!\n" );
            return 0;
        }
        for( i = 0; i < zakupy->ilosc; i++ )
        {
            if( zakupy->kodproduktu[ i ] == kod )
            {
                printf( "Wybrałeś:%s\nCenaproduktu to:%f\n", zakupy->nazwaproduktu[ i ], zakupy->cenaproduktu[ i ] );
                if( zakupy->oznaczenie[ i ] == 'S' )
                {
                    printf( "Podaj ilość sztuk:\n" );
                    spr = scanf( "%d", & sztuka );
                    while( spr == 0 || sztuka < 0 )
                    {
                        printf( "Wprowadziłeś błędne dane!Podaj jeszcze raz:\n" );
                        spr = scanf( "%d", & sztuka );
                    }
                    cena = sztuka *( zakupy->cenaproduktu[ i ] );
                    tmp->cena = cena +( tmp->cena );
                    tmp->nazwaproduktu[ j ] = zakupy->nazwaproduktu[ i ];
                    tmp->cenaproduktu[ j ] = zakupy->cenaproduktu[ i ];
                    tmp->kodproduktu[ j ] = zakupy->kodproduktu[ i ];
                    j++;
                    break;
                }
                if( zakupy->oznaczenie[ i ] == 'W' )
                {
                    printf( "Podaj wagę:\n" );
                    spr1 = scanf( "%f", & waga );
                    while( spr1 == 0 || waga < 0 )
                    {
                        printf( "Wprowadziłeś błędne dane!Podaj jeszcze raz:\n" );
                        spr = scanf( "%f", & waga );
                    }
                    cena = waga *( zakupy->cenaproduktu[ i ] );
                    tmp->cena = cena +( tmp->cena );
                    tmp->nazwaproduktu[ j ] = zakupy->nazwaproduktu[ i ];
                    tmp->cenaproduktu[ j ] = zakupy->cenaproduktu[ i ];
                    tmp->kodproduktu[ j ] = zakupy->kodproduktu[ i ];
                    j++;
                    break;
                }
            }
        }
        printf( "Aby wybrać kolejny produkt wciśnij dowolną cyfrę, aby przerwać kupowanie wciśnij dowolną literę:\n" );
        spr = scanf( "%d", & spr3 );
        if( !spr )
             break;
       
    }
    printf( "Podaj kwotę otrzymaną od klienta w celu wydania reszty:\n" );
    spr = scanf( "%f", & kwota );
    while( spr == 0 || kwota < 0 || kwota -( tmp->cena ) < 0 )
    {
        printf( "Kwota została błędnie wprowadzona!Wprowadź jeszcze raz!" );
        spr = scanf( "%f", & kwota );
    }
    tmp->reszta = kwota -( tmp->cena );
    tmp->podatek = 0.23 *( tmp->cena );
    tmp->ilosc = j;
    wyswietlzakupy( tmp );
    zapisz( tmp );
    return tmp;
}
struct zakupione * przydzielpamieczakupiona( int val )
{
    struct zakupione * kupno;
    char * prt;
    float * prt1;
    unsigned short * prt2;
    kupno =( struct zakupione * ) calloc( 1, sizeof( struct zakupione ) );
    if( kupno == NULL )
    {
        printf( "Błąd przydzielania pamięci!\n" );
        return 0;
    }
    prt =( char * ) realloc(( kupno->nazwaproduktu ),( val + 1 ) * sizeof( char ) );
    if( prt == NULL )
    {
        printf( "Błąd przydzielania pamięci!" );
        return 0;
    }
    prt1 =( float * ) realloc(( kupno->cenaproduktu ),( val + 1 ) * sizeof( float ) );
    if( prt1 == NULL )
    {
        printf( "Błąd przydzielania pamięci!" );
        free( prt );
        return 0;
    }
    prt2 =( unsigned short * ) realloc(( kupno->kodproduktu ),( val + 1 ) * sizeof( unsigned short ) );
    if( prt2 == NULL )
    {
        printf( "Błąd przydzielania pamięci!" );
        free( prt );
        free( prt1 );
        return 0;
    }
    kupno->nazwaproduktu = prt;
    kupno->cenaproduktu = prt1;
    kupno->kodproduktu = prt2;
    return( kupno );
}
struct produkt * przydzielpamiecproduktu( int val )
{
    struct produkt * kupno;
    char * prt1, * prt2;
    float * prt3;
    unsigned short * prt4;
    kupno =( struct produkt * ) calloc( 1, sizeof( struct produkt ) );
    if( kupno == NULL )
    {
        printf( "Błąd przydzielania pamięci!\n" );
        return 0;
    }
    prt1 =( char * ) realloc(( kupno->nazwaproduktu ),( val + 1 ) * sizeof( char ) );
    if( prt1 == NULL )
    {
        printf( "Błąd przydzielania pamięci!" );
        return 0;
    }
    prt2 =( char * ) realloc(( kupno->oznaczenie ),( val + 1 ) * sizeof( char ) );
    if( prt2 == NULL )
    {
        printf( "Błąd przedzielania pamięci!" );
        free( prt1 );
        return 0;
    }
    prt3 =( float * ) realloc(( kupno->cenaproduktu ),( val + 1 ) * sizeof( float ) );
    if( prt3 == NULL )
    {
        printf( "Błąd przydzielania pamięci!" );
        free( prt1 );
        free( prt2 );
        return 0;
    }
    prt4 =( unsigned short * ) realloc(( kupno->kodproduktu ),( val + 1 ) * sizeof( unsigned short ) );
    if( prt4 == NULL )
    {
        printf( "Błąd przydzielania pamięci!" );
        free( prt1 );
        free( prt2 );
        free( prt3 );
        return 0;
    }
    kupno->nazwaproduktu = prt1;
    kupno->oznaczenie = prt2;
    kupno->cenaproduktu = prt3;
    kupno->kodproduktu = prt4;
    return( kupno );
}
struct produkt * wczytaj()
{
    struct produkt * tmp = NULL;
    int mem_size = 0, i = 0;
    FILE * plik;
    plik = fopen( "produkty.csv", "rt" );
    if( plik == NULL )
    {
        printf( "Błąd otwarcia pliku!\n" );
        return 0;
    }
    printf( "Przydzielam pamięć!" );
    tmp = przydzielpamiecproduktu( mem_size );
    printf( "Przydzieliłem!\n" );
    if( tmp == NULL )
    {
        printf( "Pamięć błędnie przydzielona!" );
        fclose( plik );
        oczysc1( tmp );
        return 0;
    }
    mem_size++;
    while(( fscanf( plik, "%s;%hu%;%f;%c", & tmp->nazwaproduktu[ i ], & tmp->kodproduktu[ i ], & tmp->cenaproduktu[ i ], & tmp->oznaczenie[ i ] ) ) == 4 )
    {
        printf( "Czy byłem w while?" );
        if( tmp->oznaczenie[ i ] != 'S' || tmp->oznaczenie[ i ] != 'W' )
        {
            printf( "Błędne oznaczenie ilości/wagi!\n" );
            return 0;
        }
        tmp = przydzielpamiecproduktu( mem_size );
        if( tmp == NULL )
        {
            printf( "Pamięć błędnie przydzielona!\n" );
            fclose( plik );
            oczysc1( tmp );
            return 0;
        }
        mem_size++;
        i++;
    }
    tmp->ilosc =( i );
    fclose( plik );
    printf( "Produkty zostały pomyślnie wczytane!\nIlość odczytanych produktów wynosi %d!", tmp->ilosc );
    return( tmp );
}
void zapisz( struct zakupione * kupno )
{
    FILE * plik;
    int i = 0;
    plik = fopen( "zakupione.csv", "wt" );
    if( plik == NULL )
    {
        printf( "Błąd otwarcia pliku!\n" );
        return;
    }
    for( i = 0; i <( kupno->ilosc ); i++ )
         fprintf( plik, "%s;%hu;%f\n", kupno->nazwaproduktu[ i ], kupno->kodproduktu[ i ], kupno->cenaproduktu[ i ] );
   
    fprintf( plik, "%f\n;%f\n;%f\n", kupno->cena, kupno->reszta, kupno->podatek );
    printf( "Paragon został pomyślnie zapisany!\n" );
    fclose( plik );
}
void wyswietlprodukt( struct produkt * zakupy )
{
    int i;
    printf( "%f", zakupy->cenaproduktu[ 2 ] );
    printf( "Oto lista produktów:\n" );
    for( i = 0; i <( zakupy->ilosc ); i++ )
    {
        printf( "%f", zakupy->cenaproduktu[ i ] );
        printf( "%s %hu %f\n", zakupy->nazwaproduktu[ i ], zakupy->kodproduktu[ i ], zakupy->cenaproduktu[ i ] );
    }
    printf( "Produkty zostały wyświetlone!\n" );
}
void wyswietlzakupy( struct zakupione * kupno )
{
    int i;
    printf( "Oto paragon:\n" );
    for( i = 0; i <( kupno->ilosc ); i++ )
         printf( "%s %hu %f\n", kupno->nazwaproduktu[ i ], kupno->kodproduktu[ i ], kupno->cenaproduktu[ i ] );
   
    printf( "Cena:%fzł\nPodatek:%fzł\nReszta:%fzł\n", kupno->cena, kupno->podatek, kupno->reszta );
    printf( "Paragon został wyświetlony\n" );
}
void oczysc( struct zakupione * kupno )
{
    if( kupno == NULL )
         return;
   
    if( kupno->nazwaproduktu != NULL )
         free( kupno->nazwaproduktu );
   
    if( kupno->cenaproduktu != NULL )
         free( kupno->cenaproduktu );
   
    if( kupno->kodproduktu != NULL )
         free( kupno->kodproduktu );
   
    free( kupno );
}
void oczysc1( struct produkt * produkty )
{
    if( produkty == NULL )
         return;
   
    if( produkty->nazwaproduktu != NULL )
         free( produkty->nazwaproduktu );
   
    if( produkty->cenaproduktu != NULL )
         free( produkty->cenaproduktu );
   
    if( produkty->kodproduktu != NULL )
         free( produkty->kodproduktu );
   
    free( produkty );
}
P-103711
« 1 »
  Strona 1 z 1