Odczyt z pliku .csv - wczytuje 0 lub śmieci z pamięci

0

Proszę o pomoc w naprawieniu funkcji odszumiaj(). Nie wczytuje prawidłowo wartości zapisanych do plik.csv w funkcji generuj().

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define _USE_MATH_DEFINES
#include <math.h>
#include <time.h>

void generuj(float amplituda, float czas, float czestotliwoscProbkowania, float czestotliwoscSygnalu, float przesuniecie)
{
	float const_krok;
	float szum=0;
	float krok=0;
	int i;
	float *wyniki;
	FILE *fb;
	int liczbaProbek=floor(czas*czestotliwoscProbkowania);

	wyniki=(float*)malloc(liczbaProbek*sizeof(float));
	if(wyniki!=NULL)
	{
		const_krok=(czas)/(liczbaProbek);
		fb=fopen("plik.csv","w");
		if(fb!=NULL)
		{
			fprintf(fb,"# %d\n",liczbaProbek);
			printf("liczbaprobekgeneruj=%d.\n",liczbaProbek);
			srand((unsigned int)time(NULL));
			for (i=0;i<(liczbaProbek);i++)
			{
				szum=2*rand()/(float)RAND_MAX*(amplituda)-(amplituda);
				fprintf(fb,"%.4f,%.4f\n",2*M_PI*krok*(czestotliwoscSygnalu), (amplituda)*sin(2*M_PI*krok*(czestotliwoscSygnalu)+(przesuniecie)+szum));
				printf("%.4f,%.4f\n",2*M_PI*krok*(czestotliwoscSygnalu), (amplituda)*sin(2*M_PI*krok*(czestotliwoscSygnalu)+(przesuniecie)+szum));
				krok+=const_krok;
			};
			free(wyniki);
		}
		else printf("Blad pliku.\n");
	}
	else printf("Blad pamieci.\n");
}

void odszumiaj()
{
	FILE *fb;
	int i, liczbaProbek=0;
	float *x, *y;
	fb=fopen("plik.csv","r");
	if(fb!=NULL)
	{
		fscanf(fb,"# %d\n",&liczbaProbek);
		printf("Liczbaprobekodszumiaj=%d.\n",liczbaProbek);
		x=(float*)malloc(liczbaProbek*sizeof(float));
		y=(float*)malloc(liczbaProbek*sizeof(float));

		if(x!=NULL && y!=NULL)
		{
			for(i=0;i<100;i++)
			{
				fscanf(fb,"%.4f,%.4f\n", x[i], y[i]);
				printf("%f %f\n",x[i],y[i]);
			}
		}
		else printf("Blad pamieci.\n");
	}
	else printf("Blad odczytu pliku.\n");
}

int main (void)
{
	int liczbaProbek;
	float amplituda, czas, czestotliwoscProbkowania, czestotliwoscSygnalu, przesuniecie;
	
	printf("Podaj amplitude: ");
	scanf("%f",&amplituda);
	printf("Podaj czas: ");
	scanf("%f",&czas);
	printf("Podaj czestotliwosc probkowania: ");
	scanf("%f",&czestotliwoscProbkowania);
	printf("Podaj czestotliwosc sygnalu: ");
	scanf("%f",&czestotliwoscSygnalu);
	printf("Podaj przesuniecie: ");
	scanf("%f",&przesuniecie);
	liczbaProbek=floor(czas*czestotliwoscProbkowania);
	generuj(amplituda, czas, czestotliwoscProbkowania, czestotliwoscSygnalu, przesuniecie);
	odszumiaj();
	getch();
}
1

W obu funkcjach otwierasz plik, ale go nie zamykasz.

0

Dodatkowo w pętli przekazujesz złe argumenty do fscanfa (aż dziwne, że Ci się nie wywala).

1

Dodatkowo nie zwalniasz pamięci w odszumiaj().

0

Dzięki za pomoc, jeszcze trochę jej potrzebuję.
Teraz chcę odszumić wcześniej zaszumiony sygnał za pomocą procedury, która n-ty wynik przedstawia jako średnią arytmetyczną wyników: n-1, n, n+1.
Po pierwsze: nie działa mi zapis pliku odszumiony.csv. Jeszcze jakiś czas temu coś zapisywało, teraz tylko śmieci z pamięci - zawsze te same
Po drugie: Czy ta procedura daje poprawne wyniki?
Po trzecie: Co należałoby zmienić w kodzie, aby uczynić go bardziej czytelnym, poprawnym itp. ?

 #include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define _USE_MATH_DEFINES
#include <math.h>
#include <time.h>

void generuj(float amplituda, float czas, float czestotliwoscProbkowania, float czestotliwoscSygnalu, float przesuniecie)
{
	float const_krok;
	float szum=0;
	float krok=0;
	int i;
	float *wyniki;
	FILE *fb;
	int liczbaProbek=floor(czas*czestotliwoscProbkowania);

	wyniki=(float*)malloc(liczbaProbek*sizeof(float));
	if(wyniki!=NULL)
	{
		const_krok=(czas)/(liczbaProbek);
		fb=fopen("plik.csv","w");
		if(fb!=NULL)
		{
			fprintf(fb,"# %d\n",liczbaProbek);
			printf("liczbaprobekgeneruj=%d.\n",liczbaProbek);
			srand((unsigned int)time(NULL));
			for (i=0;i<(liczbaProbek);i++)
			{
				szum=2*rand()/(float)RAND_MAX*(amplituda)-(amplituda);
				fprintf(fb,"%.4f;%.4f\n",2*M_PI*krok*(czestotliwoscSygnalu), (amplituda)*sin(2*M_PI*krok*(czestotliwoscSygnalu)+(przesuniecie)+szum));
				krok+=const_krok;
			};
			fclose(fb);
			free(wyniki);
			printf("Dane zostaly zapisane do pliku plik.csv\n");
		}
		else printf("Blad pliku.\n");
	}
	else printf("Blad pamieci.\n");
}

void odszumiaj()
{
	FILE *fb, *fb1;
	int i, liczbaProbek=0;
	float *x, *y, *y1;
	fb=fopen("plik.csv","r");
	if(fb!=NULL)
	{
		fscanf(fb,"# %d\n",&liczbaProbek);
		x=(float*)malloc(liczbaProbek*sizeof(float));
		y=(float*)malloc(liczbaProbek*sizeof(float));
		y1=(float*)malloc(liczbaProbek*sizeof(float));
		if(x!=NULL && y!=NULL && y1!=NULL)
		{
			for(i=0;i<liczbaProbek;i++)
			{
				fscanf(fb,"%f,%f\n",x+i,y+i);
			};
			fclose(fb);
			y1[0]=y[0];
			y1[liczbaProbek-1]=y[liczbaProbek-1];
			printf("y[liczbaProbek-1]=%f     y1[liczba-1]=%f",y[liczbaProbek-1],y1[liczbaProbek-1]);
			for(i=1;i<liczbaProbek;i++){
				y1[i]=(y[i-1]+y[i]+y[i+1])/3;
			};
			fb1=fopen("odszumiony.csv","w");
			if(fb1!=NULL){
				for(i=0;i<liczbaProbek;i++){
					fprintf(fb1,"%.4f,%.4f\n",*(x+i),*(y1+i));
				};
				fclose(fb1);
			}
			else printf("Blad otwarcia pliku odszumiony.csv.\n");
		}
		else printf("Blad pamieci.\n");

		free(x);
		free(y);
		free(y1);
	}
	else printf("Blad odczytu pliku.\n");
}

int main (void)
{
	int liczbaProbek;
	float amplituda, czas, czestotliwoscProbkowania, czestotliwoscSygnalu, przesuniecie;

	printf("Podaj amplitude: ");
	scanf("%f",&amplituda);
	printf("Podaj czas: ");
	scanf("%f",&czas);
	printf("Podaj czestotliwosc probkowania: ");
	scanf("%f",&czestotliwoscProbkowania);
	printf("Podaj czestotliwosc sygnalu: ");
	scanf("%f",&czestotliwoscSygnalu);
	printf("Podaj przesuniecie: ");
	scanf("%f",&przesuniecie);
	liczbaProbek=floor(czas*czestotliwoscProbkowania);
	generuj(amplituda, czas, czestotliwoscProbkowania, czestotliwoscSygnalu, przesuniecie);
	odszumiaj();
	getch();
}

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