Wczytanie danych z pliku

0
 
#define _CRT_SECURE_NO_WARNINGS

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

#define rozszerzenie ".csv"

void Wczytaj_z_pliku(char nazwa[]);

int main()
{
	char nazwa[100];

	printf("Podaj nazwe pliku, ktory chcesz wczytac:\n");
	scanf("%s", &nazwa);

	Wczytaj_z_pliku(nazwa);

	return 0;
}

void Wczytaj_z_pliku(char nazwa[])
{
	FILE *plik;
	double arg, wartosc_przebiegu;
	int a;
	plik = fopen(("s",strcat(nazwa, rozszerzenie)), "r");
	if(plik==NULL)
	{
		perror("Blad otwarcia pliku:\n");
		exit(-10);
	}
	while (feof(plik)==0)
	{   
		a = fscanf(plik, "%lf;%lf", &arg, &wartosc_przebiegu);
		if(a==2)
			printf("%f\t%f\n",  arg, wartosc_przebiegu);
	}
	fclose(plik);

}


O to moje dotychczasowe wypociny, jest to pierwszy etap programu, który muszę napisać. I teraz chciałbym zmienne arg i wartosc_przebiegu zapisać do tablicy, z tym, że nie znam jej rozmiaru, ponieważ liczba danych zależy od pliku, który chcę wczytać. Próbowałem coś robić z malloc jednak nie jestem pewien czy to dobra strategia, a druga sprawa nie umiem tego zastosować w praktyce (w swoim programie).
Czy jest ktoś tutaj, kto rozumie zagadnienie i jest wstanie mnie w jakichś sposób nakierować bądź napisać gotową funkcję do przeanalizowania dla mnie?

0

http://4programmers.net/C/FAQ/Fstream_-_rozmiar_pliku

Ja bym to zrobił następująco.
1.Otworzyć plik
2. Iść na koniec pliku
3. Pobrać wartość.
4. Iść na początek pliku

Mniej więcej tak robią kompilatorzy z gcc lub MV

0

Masz na to trzy sposoby:

  1. Debilny - czytasz plik i nigdzie nie zapisujesz wczytanych wartości tylko zliczasz ile ich było, po czym czytasz plik jeszcze raz.
  2. "Średni" - po każdym wczytaniu powiększasz dynamicznie przydzieloną tablicę.
  3. Ambitny - na początek przydzielasz pamięć powiedzmy dla 64 elementów, jak zabraknie to podwajasz.
    Owszem są jeszcze pewne wariacje dookoła każdego z wariantów.
0
 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>

#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_SECURE_NO_WARNINGS

#define rozszerzenie ".csv"


int main()
{
	FILE *plik;
	size_t size = 64;
	char nazwa[100];
	int a, i=0;
	double *czas, *przebieg;
	double *ptc, *ptp;

	printf("Podaj nazwe pliku, ktory chcesz wczytac:\n");
	scanf("%s", &nazwa);
	
	plik = fopen(("s",strcat(nazwa, rozszerzenie)), "r");

	if(plik==NULL)
	{
		perror("Blad otwarcia pliku:\n");
		exit(-10);
	}

	czas = (double*)malloc(sizeof *czas * (size + 1));
	przebieg = (double*)malloc(sizeof *przebieg * (size+1));

	while (feof(plik)==0)
	{   
		if ((czas == czas + size)&&(przebieg == przebieg + size)) 
        {
            size *= 2;
            ptc = realloc(czas, (size + 1) * sizeof *ptc);
            ptp = realloc(przebieg, (size + 1) * sizeof *ptp);
            czas = ptc;
			przebieg = ptp;
        }
		a = fscanf(plik, "%lf,%lf", &czas[i], &przebieg[i]);
		if(a==2)
		{
			printf("%d\t%.2f\t%.2f\n", i+1, czas[i], przebieg[i]);
		}
		i++;
	}
	free(czas);
	free(przebieg);
	fclose(plik);
	
	return 0;
}

Zrezygnowałem z funkcji teraz, bo nie wiem jak je do main przekazać i spróbowałem z alokacją pamięci. Moglibyście zerknąć? Problem jest teraz taki ,że program się kompiluje i uruchamia bez błędów i ostrzeżeń, ale wczytywanie dochodzi do 200-350 próbki i się zwiesza i przestaje działać.
Próbowałem z tym debilnym pomysłem parę dni temu, ale doszedłem też do debilnego pytania, ale je zadam.
Robię funkcję dajmy int rozmiar_tablicy(jakieś argumenty), która mi zwraca wartość tego rozmiaru. To deklarując tablicę w main, w jaki sposób przekazać tę wartość jako rozmiar tablicy, aby kompilator się nie czepiał ?

1
  1. Czy słyszałeś o strukturach?
  2. (czas == czas + size) - znasz podstawy matematyki? Przy jakich wartościach to ma szansę się spełnić?
  3. To: czas = (double*)malloc(sizeof *czas * (size + 1)); przydziela pamięć na 65 elementów, czemu nie napisać po ludzku: czas=(double*)malloc(size*sizeof(double)); (oczywiście pkt 1 nadal obowiązuje)
  4. Po kiego ci to a? Pisz od razu if(2==fscanf(plik, "%lf,%lf", ...
  5. Po kiego ci ptc? Pisz od razu czas=(double*)realloc(czas,size*sizeof(double));
  6. Po zakończeniu odczytu ale przed użyciem warto zrobić realloc na rozmiar już policzony.

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