Błąd na końcu programu ? Dlaczego ?

0

Cześć. Mam taki o to kod programu. W sumie kod działa ale po wykonaniu programu wyskakuje błąd... Może ktoś z was doświadczonych znajdzie problem... Z góry dzięki.

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
#include<ctype.h>
#define N 5
struct para
{
	char napis[10];
	int rok;
	char miesiac[10];
	float cena;

};

struct dwa
{
	struct para *wsk;
	int ile;
};

void wypisanie(struct para *wsk, int l)
{
	for (int i = 0; i < l; i++)
	{
		printf("Nazwa: %s Rok: %d Miesiac: %s Cena: %.2f\n", wsk[i].napis,wsk[i].rok,wsk[i].miesiac,wsk[i].cena);
	}
	
}


struct dwa wiersz(FILE* stream)
{
	int l=0;
	while (!feof(stream))
	{
		struct para p;
		fscanf(stream, "%s %d %s %f",p.napis,&p.rok,p.miesiac,&p.cena);
		l++;
	}
	rewind(stream);
	struct para *tab = (struct para *)malloc(l * sizeof(struct para*));
	for(int i=0;i<l;i++)
	{
		fscanf(stream, "%s %d %s %f", tab[i].napis, &tab[i].rok, tab[i].miesiac, &tab[i].cena);
	}
	
	struct dwa cos;
	cos.wsk = tab;
	cos.ile = l;

	return cos;

}

int main()
{
	char f[20];								 //nazwy pllikow
	//char wynik[20];
	printf("Prosze podac nazwe pliku z danyymi(nazwa+rozszerzenie) :");
	scanf("%s", f);

	/*printf("Prosze podac nazwe pliku wynikowego(nazwa+rozszerzenie) :");
	scanf("%s", wynik);*/


	putchar('\n\n');


	//int fclose(FILE* stream);	//plik z danymi otwieranie
	FILE* stream;
	if ((stream = fopen(f, "r")) == NULL)
	{
		printf("Pliku z danymi nie udalo sie otworzyc.\n");
		return 0;
	}
	else
		printf("Plik z danymi udalo sie otworzyc.\n");



	//int fclose(FILE* stream1);	//plik wynikowy otwieranie
	//FILE* stream1;
	//if ((stream1 = fopen(wynik, "w")) == NULL)
	//{
	//	printf("Pliku z wynikami nie udalo sie otworzyc.\n");
	//	return 0;
	//}
	//else
	//	printf("Plik z wynikami udalo sie otworzyc.\n");
	////////////////////////////////////////////////////////////////////////////////
	putchar('\n\n');

		struct dwa cos=wiersz(stream);							//wywolanie funkcji 1
		wypisanie(cos.wsk,cos.ile);


	/*	for(int i=0;i<cos.ile; i++)
		fprintf(stream1, "%s %d %s %.2f\n", cos.wsk[i].napis, cos.wsk[i].rok, cos.wsk[i].miesiac, cos.wsk[i].cena);*/

	putchar('\n\n');
	/////////////////////////////////////////////////////////////////////////////////
		if (fclose(stream))			//zamykanie pliku z danymi
			printf("Plik z danymi nie zostal zamkniety.\n");
		else
			printf("Plik z danymi zostal zamkniety.\n");

		//if (fclose(stream1))			//zamykanie pliku z wynikami
		//	printf("Plik z wynikami nie zostal zamkniety.\n");
		//else
		//	printf("Plik z wynikami zostal zamkniety.\n");


	printf("\nAutor: Bartosz Rozanski.\n");
	free(cos.wsk);
	return 0;
}

3

Alokujesz za mało pamięci:

struct para *tab = (struct para *)malloc(l * sizeof(struct para*))

Wobec tego nadpisujesz pamięć poza zaalokowaną tablicą, co jest UB.

Powinno być:

struct para *tab = (struct para *)malloc(l * sizeof(struct para))

Na przyszłość staraj się też formatować kod, np. za pomocą http://format.krzaq.cc

0

Dzięki wielkie ! :D

0

jaki ma sens ta pętla? Żeby policzyć elementy????????

    while (!feof(stream))
    {
        struct para p;
        fscanf(stream, "%s %d %s %f",p.napis,&p.rok,p.miesiac,&p.cena);
        l++;
    }
0

Tak. Liczy tylko ile wierszy. (na pusto)

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