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);
		}
	}
}