W ramach zaliczenia muszę napisać program realizujący kase fiskalną, mógłby mnie ktoś naprowadzić dlaczego nie chce wczytywać z pliku? W funkcji wczytaj program nie wchodzi w ogóle do pętli a według mnie powinien, specyfikatory przy while są chyba dobrze dobrane, nie wiem co leży, pozdrawiam :)
#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=NULL;
struct zakupione *nowe=NULL;
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)
{
oczysc(nowe);
oczysc1(nowy);
printf("Żegnaj!");
return 0;
}
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(zakupy->kodproduktu[i]==kod)
{
printf("Podałeś poprawny kod!");
break;
}
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;
}
}
tmp=przydzielpamieczakupiona(j);
if(tmp==NULL)
{
printf("Błąd przydzielania pamięci!\n");
return 0;
}
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(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++;
}
if(zakupy->oznaczenie[i]=='W')
{
printf("Podaj wagę:\n");
spr1=scanf("%f",&waga);
while(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++;
}
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) // jeszcze wycofanie?
{
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!");
free(kupno);
return 0;
}
prt1=(float*)realloc((kupno->cenaproduktu),(val+1)*sizeof(float));
if(prt1==NULL)
{
printf("Błąd przydzielania pamięci!");
free(prt);
free(kupno);
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);
free(kupno);
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!");
free(kupno);
return 0;
}
prt2=(char*)realloc((kupno->oznaczenie),(val+1)*sizeof(char));
if(prt2==NULL)
{
printf("Błąd przedzielania pamięci!");
free(prt1);
free(kupno);
return 0;
}
prt3=(float*)realloc((kupno->cenaproduktu),(val+1)*sizeof(float));
if(prt3==NULL)
{
printf("Błąd przydzielania pamięci!");
free(prt1);
free(prt2);
free(kupno);
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);
free(kupno);
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,"%f;%hu;%c;%s\n",&tmp->cenaproduktu[i],&tmp->kodproduktu[i],&tmp->oznaczenie[i],&tmp->nazwaproduktu[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++;
}
printf("Pomijam\n");
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);
if(produkty->oznaczenie!=NULL);
free(produkty->oznaczenie);
free(produkty);
}