[C] Wczytywanie z pliku binarnego

0

Witam.

Mam taką listę:

/* Struktura ksiazka dla pojedynczego woluminu */
/* Pola nast i poprz to wskazniki na nastepny i poprzedni element listy */
struct ksiazka
{
	char tytul[256];
	char autor[256];
	int rok;
	int wydanie;
	struct ksiazka* nast;
	struct ksiazka* poprz;
};

/* Wskaźniki do pierwszego i ostatniego elementu */
/* Bezposredni dostep dla kazdej funkcji */
struct ksiazka *pierwszy = NULL;
struct ksiazka *ostatni = NULL;

Po zaplelnieniu jej danymi zapisuje ja do pliku:

/* Funkcja zapisująca baze do pliku */
int zapisz_do_pliku(void)
{
	FILE *f;
	struct ksiazka *pomocniczy;
	pomocniczy=pierwszy;
	f=fopen("dane.bin","wb");
	if (f!=NULL){
		while(pomocniczy!=NULL){
			fwrite(pomocniczy, sizeof(struct ksiazka), 1, f);
			pomocniczy=pomocniczy->nast;
		}
	}
	fclose(f);
	return 0;
}

Jak się zabrać do wczytania tego pliku wygenerowanego w taki sposób, by dane z listy w pamięci zostały zastąpione danymi z pliku?

0

Za pomoca fread ;p

Jak zapisujesz sobie taka strukture to nie masz rozgraniczenia przy int'ach, wiec sobie zapisoj ale element po elemencie oraz zapisuj miedzy elementami jakis znak, aby to rozgraniczyc, np. '\0' lub '\n'.
Te dwa stringi poczatkowe w strukturze beda sie konczyc '\0', ale gorzej z liczbami, wiec po prostu zapisz cos jeszcze co to rozdzieli.

0

*zapisuj

0

Czyli za pomocą fwrite zapisywać kolejno każde pole każdego elementu listy?
I jak to potem wczytać z powrotem do listy? fwrite mi wczyta tylko tyle ile mu kaze, jak wczytać nastepny element listy?

0

Tak masz racje, fread wczyta Ci tyle ile mu kazesz, wiec moze kaz mu wiecej wczytac albo uzyj tej funkcji kilka razy.

Zreszta masz rozmiar tej struktury 520 bajtow(bez pointerow), wiec wczytujesz sobie tyle do struktury i bedzie ok, nie wiem w czym widzisz w ogóle tu problem.
Normalnie to wczytujesz i tyle. Te rozdzielanie nawet nie jest potrzebne jak zapelnisz te tablice swoja do konca lub dopelnisz zerami.

fread(&struktura, 1, 520, file_pointer);

0

Trzymaj przyklad, zebys zalapal, bo troche niejasno napisalem.

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

typedef struct
{
	char imie[32];
	char surimie[32];
	int walek;
} cojest;

int main(void)
{
	cojest bob;

	memset(&bob, '\0', 68);
//	strcpy(bob.imie, "roman\0");
//	strcpy(bob.surimie, "asjkdjkasdj\0");
//	bob.walek = 123;

	FILE *fp = fopen("plik.bin", "rb");
	fread(&bob, 1, 68, fp);

	printf("%s %s %d\n", bob.imie, bob.surimie, bob.walek);

	fclose(fp);

	return 0;
}
0

Każdy element listy jest wyzerowany memstem przy alokacji pamięci, więc tutaj problemu nie ma, bardziej chodzi o to, że jak już wczytam pierwszy element z pliku i sobie go ustawię na początku listy, to nie wiem jak się dobrać do następnych z tego pliku.

0

http://pl.wikibooks.org/wiki/C/fread

wczytujesz, alokujesz, zapisujesz :)

0

I tak w pętli, az odczytam element ze wskaznikiem wskazujacy na nastepny element o wartości NULL, czy jest jakiś sprytniejszy sposób?

0

Ostatecznie mam coś takiego:

/* Wczytuje liste z pliku dane.bin */
/* Lista w pamięci jest zerowana przed wczytaniem listy z pliku */
int wczytaj_z_pliku(void)
{
	FILE *f;
	struct ksiazka *nowy;
	kasuj_liste();
	f=fopen("dane.bin","r");
	
	while (1){
		if(pierwszy==NULL){
			if((nowy=(struct ksiazka*)malloc(sizeof(struct ksiazka))) == NULL) return 1;
			if(1!=fread(nowy, sizeof(struct ksiazka), 1, f)) break;
			nowy->nast=NULL;
			nowy->poprz=NULL;
			pierwszy=nowy;
			ostatni=nowy;
	}
		else {
			if((nowy=(struct ksiazka*)malloc(sizeof(struct ksiazka))) == NULL) return 1;
			if(1!=fread(nowy, sizeof(struct ksiazka), 1, f)) break;
			nowy->nast=NULL;
			nowy->poprz=ostatni;
			ostatni->nast=nowy;
			ostatni=nowy;
		}
	}
	fclose(f);
}

Nie wiem, na ile jest to poprawne i eleganckie, ale działa.
Dzięki wielkie za pomoc.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.