strukturka + binarja

0

pytanie dla znawcow pewnie banalnie proste :), ale...

Jak, majac listę struktur (dwukierunkowa), zapisac dane z niej do pliku binarnego i jak potem je odczytac :/?


void WczytajPlik(void)
{
struct OpisCD *temp;
FILE* plik=fopen("baza.dat","rt");
fread(temp,1,sizeof(struct OpisCD),plik);
fclose(plik);
}


void ZapiszBaze()
{
FILE* plik=fopen("baza.dat","w");
struct OpisCD *temp;
temp=glowa;
while (temp!=NULL)
{
fwrite(temp,1,sizeof(struct OpisCD),plik);
temp=temp->nastepny;
}
fclose(plik);
}

zapisywanie (chyba) działa, ale z wczytaniem jest gorzej, progs wiesza sie podczas wczytywania, na razie mam ustaione wczytanie tylko 1 elementu "temp", ale jak zadziala zrobie sobie na wiecej.

Co robie zle? lub jaki jest sposob na zapis i potem odczyt listy struktur do i z pliku :]...

0

No jezeli twoja lista dziala glownie na wskaznikach to masz maly problem, bedziesz musial opracowac format pliku i odpowiednio zapisywac wsztskie dane, aby przy odczycie nie odzytywal bylych wskaznikow tylko rzeczywiste dane....

0

struct OpisCD
{
char zespol[30];
char nazwacd[30];
int rok;
char wytwornia[30];
char pozyczony[30];
char czas[30];
struct OpisCD *nastepny, *poprzedni;
};

tak wyglada pojedyncza strukturka listy, czyli, skoro sie nie da, lepiej zapisywac do pliku tekstowego :/?

co prawda wolalbym binarny, ale nie mam pojecia jak... :(

0

Może nie działa dlatego, że zapisujesz wskaźniki?
Jeżeli tak przeprowadź dereferencje.

0

cio to znaczy dereferencja :]?

sprawdzilem czy dziala osobno kazda wartosc, zapisywanie w zasadzie działa, bo plik powstaje, wartosci ma w sobie, ale na odczycie ciagle sie wiesza, NIEWIEM CZEMU (a wskaznikow juz tam nie ma) :/...

zamiast zapisu/odczytu calych struktur daje pojedyncze pola:


void WczytajPlik(void)
{
struct OpisCD *temp;
char rokt[4];
FILE* plik=fopen("baza.dat","rt");

fread(temp->zespol,1,30,plik);
fread(temp->nazwacd,1,30,plik);
fread(rokt,1,4,plik);
fread(temp->wytwornia,1,30,plik);
fread(temp->pozyczony,1,30,plik);
fread(temp->czas,1,30,plik);
temp->rok = atoi(rokt);

DodajDoPosortowanej(&glowa,temp->zespol,temp->nazwacd,temp->rok,temp->wytwornia,temp->pozyczony,temp->czas);

}

void ZapiszBaze()
{
FILE* plik=fopen("baza.dat","w");
char rokt[4];
struct OpisCD *temp;
temp=glowa;
while (temp!=NULL)
{
fwrite(temp->zespol,1,30,plik);
fwrite(temp->nazwacd,1,30,plik);
itoa(IntToStr(temp->rok), rokt, 2);
fwrite(rokt,1,4,plik);
fwrite(temp->wytwornia,1,30,plik);
fwrite(temp->pozyczony,1,30,plik);
fwrite(temp->czas,1,30,plik);
temp=temp->nastepny;
}
fclose(plik);
}

Czy są w ogóle jakies inne sposoby zapisu/odczytu do/z pliku binarnego, bo ta metoda jakos nie dziala :/, chyba ze znowu robie jakis bląd...

0

Wydaje mi się że wskażników nie możesz zapisać, każdą po kolei strukturę kopiować do struktury bez wskaźników i tak je rzutować. To samo przy wczytywaniu: wczytujesz do strkutury bez wskaźników i dopiero z niej kopiujesz do struktury ze wskaźnikami, odpowiednio je ustawiając.

Nie mam dzisiaj czasu kodu napisać, jeśli do jutra nie bedzie odpowiedzi to napiszę :-) [cya]

0

Zrobilem tak, w zasadzie to juz chyba bez znaczenia czy bezposrednio, czy robic nowe strukturki, ale dalej nie dziala, a co ciekawsze teraz wiesza sie na zapisywaniu do pliku


void WczytajPlik(void)
{
struct temps
  {
    char zespol[30];
    char nazwacd[30];
    int rok;
    char wytwornia[30];
    char pozyczony[30];
    char czas[30];
  };

struct temps *temp2;

FILE* plik=fopen("baza.dat","rt");
//while (!eof(plik))
{
fread(temp2,1,sizeof(struct temps),plik);

DodajDoPosortowanej(&glowa,temp2->zespol,temp2->nazwacd,temp2->rok,temp2->wytwornia,temp2->pozyczony,temp2->czas);

}
fclose(plik);
}
}



void ZapiszBaze()
{

struct temps
  {
    char zespol[30];
    char nazwacd[30];
    int rok;
    char wytwornia[30];
    char pozyczony[30];
    char czas[30];
  };

FILE* plik=fopen("baza.dat","w");
struct temps *temp2;
struct OpisCD *temp;
temp=glowa;
while (temp!=NULL)
{
strcpy(temp2->zespol,temp->zespol);
strcpy(temp2->nazwacd,temp->nazwacd);
temp2->rok=temp->rok;
strcpy(temp2->wytwornia,temp->wytwornia);
strcpy(temp2->pozyczony,temp->pozyczony);
strcpy(temp2->czas,temp->czas);

fwrite(temp2,1,sizeof(struct temps),plik);
temp=temp->nastepny;
}
fclose(plik);
}

a ja dalej nie mam pojecia gdzie robie blad, teraz jestem juz prawie pewny ze to przez jakis maly blad, bo w zasadzie pod wzgledem teoretycznym TO POWINNO DZIAŁAC :/? !

0

i znalazlem problema, w zasadzie teraz juz chiba dziala :]:

struct temps tempd;
struct temps *temp2;

deklarowalem sam wskaznik :/...

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