zmiany dokonywanie w pliku

0

Mam taki oto program:

 #include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct magazyn
{
	char nazwa[30];
	int cena, ilosc;
}magazyn;

void dodaj(char *nazwa, int ilosc, int cena);
void sprzedaz(void);
void zestawienie(void);

main()
{
	dodaj(magazyn.nazwa,magazyn.ilosc,magazyn.cena);
	sprzedaz();
	zestawienie();
	system("pause");
}

void dodaj(char *nazwa, int ilosc, int cena)
{
	int i,a;
	FILE *fp=fopen("magazyn.txt", "a");
	printf("Podaj ilosc towarow do dodania: \n");
	scanf("%d", &a);
	for(i=0;i<a;i++)
	{
		printf("\nPodaj nazwe towaru: ");
		scanf("%29s", magazyn.nazwa);
		printf("\nPodaj jego ilosc: ");
		scanf("%d", &magazyn.ilosc);
		printf("\nPodaj jego cene: ");
		scanf("%d", &magazyn.cena);
		fprintf(fp,"%s\t\t%d\t%d\n",magazyn.nazwa,magazyn.ilosc,magazyn.cena);
	}
	fclose(fp);
}

void sprzedaz(void)
{
	FILE *fp = fopen("magazyn.txt", "r");
	char odp[5],nazwa[30];
	int i=0,a,ilosc;
	do
	{
	printf("\nPodaj nazwe towaru, ktory zostal sprzedany: ");
	scanf("%29s", nazwa);
	printf("\nPodaj ilosc sprzedanego towaru: ");
	scanf("%d", &ilosc);
	while(!feof(fp))
	{
		fscanf(fp,"%s%d%d", magazyn.nazwa, &magazyn.cena, &magazyn.ilosc);
		i++;
	}
	fclose(fp);
	fp = fopen("magazyn.txt", "w");
	fclose(fp);
	fp = fopen("magazyn.txt", "a");
	for (a=0;a<i;a++)
	{
		if(!strcmp(magazyn.nazwa,nazwa))
		{
			magazyn.ilosc = magazyn.ilosc - ilosc;
		}
	}
	for (a=0;a<i;a++)
	{
		if (magazyn.ilosc>0)
		{
			fprintf(fp,"%s\t\t%d\t%d\n",magazyn.nazwa,magazyn.cena,magazyn.ilosc);
		}
	}
	printf("\nCzy sprzedaz zostala zakonczona? t - tak\tn - nie\n");
	scanf("%5s", &odp);
	}
	while (odp[0] != 't');
	fclose(fp);
}

void zestawienie(void)
{
	FILE *fp=fopen("magazyn.txt", "r");
	int wartosc=0,suma=0;
	printf("Nazwa towaru\tIlosc\tCena\tWartosc\n");
	while (!feof(fp))
	{
		fscanf(fp,"%s%d%d", magazyn.nazwa, &magazyn.cena, &magazyn.ilosc);
		wartosc=magazyn.ilosc*magazyn.cena;
		printf("%s\t\t%d\t%d\t%d\n", magazyn.nazwa, magazyn.cena, magazyn.ilosc, wartosc);
		suma = suma + wartosc;
	}
	printf("\n\n");
	printf("Suma wartosci towarow: %d\n", suma);
	fclose(fp);
}

Niestety nie wiem dlaczego nie działa mi dobrze funkcja sprzedaż. Próbowalem różnymi sposobami zmieniać, ale dalej ta funkcja źle odejmuje w pliku

0

Ma ktoś pomysł dlaczego nie działa?

0

Ma ktoś pomysł dlaczego nie działa?

Ciężko coś powiedzieć, ponieważ Twoje pytanie nie jest specjalnie dobrze zadane...

Przede wszystkim, ktoś kto potencjalnie chciałby pomóc musi wykonać sporą ilość roboty, na przykład dopisać sobie main, stworzyć własny plik z danymi (!), etc - nikomu się tego nie chce robić, szczególnie że od siebie dorzuciłeś na forum dwa zdania, sprowadzające się do 'nie działa'.

Tak czy inaczej, mógłbyś trochę sprecyzować/podać więcej szczegółów?

Edit 1:
Na przykład, do czego służy ten kod:?

fp = fopen("magazyn.txt", "w");
fclose(fp);

<b=ech, głupieję na starość></b>

0

Jak wrzucisz do kompilatora, to wtedy zrobi Ci plik, bo wszystkie pozostałe funkcję działają, tylko jest problem z funkcją sprzedaz, bo dziwnie działa nie odejmuje ilości, tylko coś z ceną kombinuje, ale sam nie wiem co i jak.

Ten fragment służy do wyczyszczenia pliku przed zapisem do niego nowych danych

0

Dobra, to sprecyzuję dokładniej. Funkcja ma za zadanie zapytać się użytkownika jaki towar został sprzedany oraz ilość sprzedanego towaru, następnie powinna szukać w pliku tego towaru i zmniejszyć jego ilość o podana przez użytkownika, w przypadku gdy ilość sprzedanego towaru jest równa ilości w pliku, to kasuje ten towar z pliku. Niestety nie chce mi to zadziałać, dziwnie się zachowuje ta funkcja.

1

Ale bez tego fragmentu, funkcja dalej nie działa

Wiem, wiem.

Nie może działać, bo cały czas masz w pamięci zapisaną tylko jeden obiekt z magazynu a próbujesz do niego pakować cały plik:

        while(!feof(fp))
        {
                fscanf(fp,"%s%d%d", magazyn.nazwa, &magazyn.cena, &magazyn.ilosc); // wczytujesz wszystko cały czas do jednej struktury!
                // w ten sposób nadpisujesz wszystko a zostaje ostatnio obiekt
                i++;
        }
        fclose(fp);
        fp = fopen("magazyn.txt", "w");
        fclose(fp);
        fp = fopen("magazyn.txt", "a");
        for (a=0;a<i;a++)
        {
                if(!strcmp(magazyn.nazwa,nazwa))
                {
                        magazyn.ilosc = magazyn.ilosc - ilosc;
                }
        }
        for (a=0;a<i;a++)
        {
                if (magazyn.ilosc>0)
                {
                        fprintf(fp,"%s\t\t%d\t%d\n",magazyn.nazwa,magazyn.cena,magazyn.ilosc); // i zapisujesz ten sam obiekt i razy do pliku...
                }
        }

Proponowane rozwiązanie w pseudokodzie:

plik = open("magazyn.txt")
tmp = open("tymczasowy.tmp")
while(!eof(plik)):
    magazyn = czytaj(plik)
    if magazyn.nazwa == usuwany:
        magazyn.ilosc -= ilosc_do_usuniecia
    if magazyn.ilosc > 0:
        tmp.write(rekord)
close("tymczasowy.tmp")
close("magazyn.txt")
remove("magazyn.txt")
rename("tymczasowy.tmp", "magazyn.txt");
0

Zrobiłem takie coś, ale dalej nie robi tego co powinno:

while (feof(fp))
		{
			fscanf(fp,"%s%d%d", magazyn.nazwa, &magazyn.ilosc, &magazyn.cena);
			p = strcmp(magazyn.nazwa,nazwa);
			if (p == 0)
			{
				magazyn.ilosc = magazyn.ilosc - ilosc;
				if (magazyn.ilosc > 0)
				{
					fprintf(fp2,"%s\t\t%d\t%d\n",magazyn.nazwa,magazyn.ilosc,magazyn.cena);
				}
			}
			else
			{
				fprintf(fp2,"%s\t\t%d\t%d\n",magazyn.nazwa,magazyn.ilosc,magazyn.cena);
			}
		}
		fclose(fp);
		fclose(fp2);
		remove("magazyn.txt");
		rename("pomoc.txt", "magazyn.txt"); 
0

Już działa, bo nie dałem wykrzyknika dla pętli, tam powinno być: while(!feof(fp))
Ale jest jeszcze problem, że ostatnią pozycję zawartą w tym pliku podwaja, czyli wyświetla:
pomidor 300 3 900
jablko 100 5 500
jablko 100 5 500
A powinno tylko raz wyświetlić pozycję jablko

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