Mam trzy pytania odnośnie zapisu i odczytu plików binarnych, po pierwsze dlaczego jak zapisuje dane do pliku, to ostatnia pozycja jest wyświetlana podwójnie?
Drugie pytanie, to w funkcji sprzedaż użyłem drugiego pomocniczego pliku do zapisu danych, jednak jak usuwam stary, a tego pomocniczego zmieniam nazwę, to program nic nie wykonuje. Trzecie pytanie mam odnośnie funkcji usuń, dlaczego ona nie wykonuje swojej operacji, tylko program się zatrzymuje i nic nie robi?
Oto kod:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct magazyn
{
char nazwa[30];
int ilosc, cena;
}magazyn;
void dodaj(char *nazwa, int ilosc, int cena);
void sprzedaz(void);
void zestawienie(void);
void usun(void);
main()
{
zestawienie();
dodaj(magazyn.nazwa, magazyn.ilosc, magazyn.cena);
zestawienie();
sprzedaz();
zestawienie();
usun();
system("pause");
}
void dodaj(char *nazwa, int ilosc, int cena)
{
FILE *fp = fopen("magazyn.txt","ab");
printf("\n\nPodaj nazwe towaru do dodania: ");
scanf("%29s", magazyn.nazwa);
printf("\nPodaj jego ilosc: ");
scanf("%d", &magazyn.ilosc);
printf("\nPodaj jego cene: ");
scanf("%d", &magazyn.cena);
fwrite(&magazyn, sizeof(struct magazyn), 1, fp);
fclose(fp);
}
void sprzedaz(void)
{
FILE *fp=fopen("magazyn.txt", "rb");
FILE *fp2=fopen("pomoc.txt", "ab");
char nazwa[30],odp[5];
int ilosc;
do
{
printf("\nPodaj nazwe sprzedawanego towaru: ");
scanf("%29s", nazwa);
printf("\nPodaj ilosc sprzedanego towaru: ");
scanf("%d", &ilosc);
while (!feof(fp))
{
fread(&magazyn, sizeof(struct magazyn), 1, fp);
if (!strcmp(magazyn.nazwa, nazwa))
{
magazyn.ilosc = magazyn.ilosc - ilosc;
if (magazyn.ilosc > 0)
{
fwrite(&magazyn, sizeof(struct magazyn), 1, fp2);
}
}
else
{
fwrite(&magazyn, sizeof(struct magazyn), 1, fp2);
}
}
printf("Czy sprzedaz zostala zakonczona?\nOdpowiedz: ");
scanf("%4s", odp);
}
while (odp[0]!='t');
fclose(fp);
fclose(fp2);
remove("magazyn.txt");
rename("pomoc.txt", "magazyn.txt");
}
void zestawienie(void)
{
FILE *fp=fopen("magazyn.txt", "rb");
int wartosc=0, suma=0;
printf("Nazwa towaru\tIlosc\tCena\tWartosc\n");
while (!feof(fp))
{
fread(&magazyn, sizeof(struct magazyn), 1, fp);
wartosc = magazyn.ilosc * magazyn.cena;
printf("%s\t\t%d\t%d\t%d\n", magazyn.nazwa, magazyn.ilosc, magazyn.cena, wartosc);
suma = suma + wartosc;
}
printf("\n\nSuma wartosci towarow: %d\n\n", suma);
}
void usun(void)
{
FILE *fp=fopen("magazyn.txt", "r+b");
char nazwa[30];
printf("\nPodaj nazwe towru do usuniecia: ");
scanf("%29s", nazwa);
while (!feof(fp))
{
fread(&magazyn, sizeof(struct magazyn), 1, fp);
if (!strcmp(magazyn.nazwa, nazwa))
{
printf("Towar usuniety\n");
}
else
{
fwrite(&magazyn, sizeof(struct magazyn), 1, fp);
}
}
}