Wczytywanie z pliku do listy

Odpowiedz Nowy wątek
2011-07-30 14:51
0

Witam, mam taki kawałek kodu:

 typedef struct lista
{   int id_klienta;
    char *imie_nazwisko;
    struct lista *nast_klient;
    int ilosc; //ilosc rachunkow
    float *TAB_rachunki[];
}klient;

dla struktury oraz kod własciwy:

  void lista_f()
{
    int i = 0;
    int z,y;//zmienne pomocnicze,obsluga petli
    char x[10];
    klient* pierwszy;
        while(1)
        {
            if(feof(lista_klientow) == 0)
    {
        if(i == 0)
            {
            glowa = malloc(sizeof(klient));
              pierwszy=glowa;
            }
        else{
            glowa->nast_klient = malloc(sizeof(klient));
            glowa = glowa->nast_klient;
            }
        fscanf(lista_klientow,"%i %s %i",&z,x,&y);
        glowa->id_klienta=z; glowa->imie_nazwisko=x; glowa->ilosc=y;
 
        printf("%i %s %i\n",glowa->id_klienta,glowa->imie_nazwisko,glowa->ilosc);
        i++;
    }
            else {glowa->nast_klient=NULL;glowa=pierwszy;break;}
    }
    printf("Liczba wczytanych klientow: %d\n",i);
             while(1){
        printf("%i %s %i\n",glowa->id_klienta,glowa->imie_nazwisko,glowa->ilosc);
        if(glowa->nast_klient == NULL){
            glowa=pierwszy;
            break;
        } else{
             glowa = glowa->nast_klient;
        }
    }
};

(otwarcie pliku,zamkniecie itp mam w innym fragmencie,otwiera zaraz przed wywolaniem funkcji lista_f();, a zamyka zaraz po tym)
W pliku dane powypisywane sa w ten sposob: 1 nazwisko1 1 2 nazwisko2 2 3 nazwisko3 3
Wyglada na to, ze wczytuje dobrze, bo po pierwszym wypisaniu(zaraz po pobraniu wartosci) sa one prawidlowe. Gorzej z wypisaniem na koncu funkcji.
Problem z tym jest nastepujacy: funkcja jakimś cudem wczytuje do kazdego pola imie_nazwisko w każdym elemencie listy OSTATNIE w pliku imie_nazwisko(nie mam pojecia jak, bo cyfry tj. id_klienta i ilosc trzyma poprawnie).Wygląda to tak:

1 nazwisko3 1
2 nazwisko3 2
3 nazwisko3 3

Co jeszcze dziwniejsze(no,przynajmniej dla mnie), pierwszy rownież się zmienia, chociaz powinien trzymać wartosc pierwszego wczytanego klienta, bo przeciez przypisuje do niego glowę tylko raz, przy pierwszym obiegu pętli.
Niestety sam nie umiem znaleźć błędu, dlatego proszę o pomoc.
@Edit- Przy zrobieniu

 fscanf(lista_klientow,"%i %s %i",& glowa->id_klienta,glowa->imie_nazwisko,&glowa->ilosc);
 

program wywala się po wczytaniu 1 klienta. Jesli ktoś umiałby pomoć byłbym bardzo wdzieczny :)

edytowany 2x, ostatnio: margarynka, 2011-07-30 14:54
Sformatuj ten kod jak człowiek. - Rev 2011-07-31 01:30

Pozostało 580 znaków

2011-07-30 20:50
0

Shameless selfbump po 6 godzinach bez odpowiedzi... Prosze o jakiekolwiek pomysly co z tym jest nie tak, bo ja juz do tego nie mam sily, jakbym sie za to nie bral dochodze do wniosku,ze powinno dzialac...

edytowany 1x, ostatnio: margarynka, 2011-07-30 20:51

Pozostało 580 znaków

2011-07-31 01:14

A zrób tak, że do struktury dodasz :

 char tab[10]; 

i potem wczytujesz z pliku do tej tymczasowej tablicy x i kopiujesz w petli do tablicy w strukturze czyli:

 
int i=0;
while(x[i]!='\0'){
  glowa->tab[i] = x[i];
++i;
}
 

Pozostało 580 znaków

2011-08-01 13:28
0

Dzieki, teraz nie ma juz problemu z "nietrzymaniem" napisu... Przy Twoim rozwiązaniu doklejał jakieś smieci do tego, ale dzięki niemu przypomniałem sobie o czymś takim jak strcpy(); i działa :)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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