zapis i odczyt z pliku binarnego w C

0

Mam dwa 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
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);

main()
{
	zestawienie();
	dodaj(magazyn.nazwa, magazyn.ilosc, magazyn.cena);
	zestawienie();
	sprzedaz();
	zestawienie();
	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);
} 
0

feof(fp) - zwraca true dopiero po próbie czytania poza plikiem, a nie w momencie osiągnięcia końca pliku!
Można to poprawić np tak:

while (fread(&magazyn, sizeof(struct magazyn), 1, fp)>0) {
    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;
}

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