Wczytanie informacji z pliku binarnego

0

Cześć, dostałam za zadanie napisać funkcję, która umożliwi odczyt z pliku binarnego, zaalokuje tablicę wskazywaną przez *osoby, wypełni ją wczytanymi danymi oraz zapisze liczbę wczytanych rekordów w zmiennej *n. Poniżej przesyłam kod, którego nie umiem skończyć, wysypuje się niestety. Byłabym ogromnie wdzięczna za jakiekolwiek wskazówki. Pozdrawiam serdecznie ! Może jeszcze w skrócie aby wypełnić tablicę wskazywaną przez *osoby pobierałam oddzielnie wiek jak i imię dlatego korzystałam z funkcji strtok, która wyodrębniała mi te dane, gdyż wiek i imię są rozdzielone spacją.

typedef struct
{
	int wiek;
	char* imie;
}Osoba;
void zapisz(Osoba* osoby, int n) // funkcja umożliwia zapis do pliku binarnego wszystkich informacji zawartych w tablicy osoby, rozmiar tablicy wynosi n
{

	FILE *zapis = fopen("plik.bin", "wb");
	if (zapis == NULL)
	{
		printf("Nie ma takiego pliku");
		return;
	}
	fprintf(zapis, "%i\n", n);
	for (int i = 0; i < n; i++)
	{
		fprintf(zapis, "%i %s\n", osoby[i].wiek, osoby[i].imie);
	}
	fclose(zapis);
}

void wczytaj(Osoba** osoby, int* n)
{
	char bufor[TAB];
	size_t len = 0;
	size_t liczbaZnakow;
	int licznikWierszy = 0;
	int rozmiarTablicy = 0;
	FILE* plik = fopen("plik.bin", "rb");
	if (plik == NULL)
		exit(EXIT_FAILURE);

	while (fgets(bufor, 1024, (FILE*)plik)) {
		
		printf("%s", bufor);
		//osoba->imie = "witek";
		//osoba->wiek = 9;
		char tab[100][STR_LEN + 100] = { { 0 } }; //tablica napisow
		char * token;
		char* sep = " ";
		int licznik_slow = 0;

		int n = 0;
		token = strtok(bufor, sep);
		while (token != NULL && n < TAB_LEN)
		{
			//printf("token: %s\n", token);
			++n;
			strncpy(tab[n - 1], token, STR_LEN+100);
			token = strtok(0, sep);
		}
		if (licznikWierszy == 0) {
			rozmiarTablicy = atoi(bufor);
		}
		else
		{
			Osoba* osoba = malloc(n * sizeof(char)*sizeof(int));
			osoba->wiek = atoi(tab[0]);
			osoba->imie = tab[1];
		
			osoby[licznikWierszy] = osoba;

		printf("PO ROZDZIELENIU: wiek:%s imie:%s\n", tab[0], tab[1]);
		}
	licznikWierszy++;
	}
	
	fclose(plik);
	*n = rozmiarTablicy;

}
void zad3()
{
	Osoba  tablica[5] = { { 5, "Asia" } , { 18, "Marcin" }, { 20, "Aneta" }, { 15, "Karolina" }, { 18, "Piotr" }
};
	int liczba_rekordow=0;
	Osoba** wczytane_osoby = malloc(6 * sizeof(Osoba));
	//zapisz(tablica, 5);
	wczytaj(wczytane_osoby, &liczba_rekordow);
	
}
0

Nie do końca wiem jak program miałby działać ale kilka rzeczy mi się nie podoba:

  1. Alokujesz pamięć na 6 obiektów typu Osoba, a nie na 6 wskaźników do obiektów typu Osoba
Osoba** wczytane_osoby = malloc(6 * sizeof(Osoba));
  1. Błąd nr 1 świadczy o tym, ze wiesz jak alokować pamięć na obiekt, a tutaj robisz coś innego
Osoba* osoba = malloc(n * sizeof(char)*sizeof(int));
  1. W kwestii estetycznej: błagam zamień kolejność tych linii i usuń -1 z tablicy
 ++n;
 strncpy(tab[n - 1], token, STR_LEN+100);
  1. Staraj się nie używać surowych liczb tak jak poniżej (użyj #define) , bo strasznie utrudnia to zrozumienie kodu
char tab[100][STR_LEN + 100] = { { 0 } }; //tablica napisow
0

Już to zmieniam w takim razie, cały kod to są 4 zadania różniące się od siebie dlatego nie wrzucałam całości ale nie ma surowych liczb tylko wszystkie stałe są zdefiniowane za pomocą #define. Jeśli dobrze rozumiem jeśli chce poprawnie wpisać dane do tej tablicy muszę zaalokować pamięć na 6 wskaźników do obiektów typu osoba?

0

Jeśli chcesz mieć tablicę obiektów Osoba to wystarczy: Osoba* a nie Osoba** i wtedy funkcja malloc jest poprawna. Ale wtedy musisz przekazać wskaźnik do zmiennej wczytane_osoby użyj &wczytane_osoby tj.

wczytaj(&wczytane_osoby, &liczba_rekordow);
0

Okej, w takim razie idę wykorzystać podane wskazówki, za które dziękuję

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