Mam problem odnosnie list prosze o pomoca...

0

Problem jest nastepujacy:
Mam do zrobienia programik w czystym C, narzucone pewne warunki tzn prosta ksiazka telefoniczna na listach niestety :)
Jest plik np. txt w ktorym zapisane sa dane postaci:
Imie|Nazwisko|telefon|adres|miejscowosc

Po pierwsze program wczytuje dane z pliku uzywajac funkcji fgets i strtok i tworzy liste dynamiczna za chwile przedstawie kod , i tu pojawia sie problem
Moj kod wyglada tak:
Zadeklarowana jest struktura:
struct elem {
char *imie;
char *nazwisko;
char *tel;
char *adres;
char *miejscowosc;
struct elem *nast;
struct elem *poprz;
};

Nastepnie tworzenie listy:
struct elem * glowa = NULL ;
struct elem *p ;
char wiersz[100];
if ( (wej = fopen("test.txt","r")) == NULL )
printf("Blad otwarcia pliku");
while(!feof(wej))
{
fgets(wiersz,300,wej);
p = (struct elem *)malloc(sizeof(struct elem));
p->imie = strtok(wiersz,"|");
p->nazwisko = strtok(NULL,"|");
p->tel = strtok(NULL,"|");
p->adres = strtok(NULL,"|");
p->miejscowosc = strtok(NULL,"|");
printf("%s " ,p->imie);
printf("%s ",p->nazwisko);
printf("%s ",p->tel);
printf("%s ",p->adres);
printf("%s",p->miejscowosc);
p->nast = glowa;
glowa = p;
}
for (p=glowa;p;p=p->nast)
printf("\n%s" ,p->imie);

wszystkie printf-y z petli while wypisuja prawidlowe wartosci, natomiast petla for powinna wypisac wszystkie imiona natomiast wypisywane jest tylko ostatnie imie tyle razy ile jest elementow w liscie .
Pytanie: co jest zle w kodzie?
wszystko dziala dobrze przy zalozeniu ze elementami struktury sa int-ygery natomiast z charami jest problem , wyglada to tak jakby petle for nie szla po calej liscie tylko stala w miejscu macie moze jakis pomysl ?
pozdrowka
Glina

0

ma byc:
for (p=glowa ; p ; p=p->nast)
printf("\n%s" ,p->imie);

0

Może zmień definicje char * na char [100] ?? Może zadziała.

0

strtok zwraca wartosc typu char *.
Skomppilowalem programik dla dosowym kompilatorze i na windowsowym bodajrze 5.01 i musze przyznac ze sa calkiem rozne wyniki, na dosowym jakies cyferki powyskakiwaly z paroma zwrotami : [NULL] a na windowsowym niby dziala tylko jest ten problem co napisalem hmmm musze przyznac ze zglupialem :(

0

komunikat cannot convert char * to char , wpadlem na to ale niestety bo strtok zwraca char* :)

0

po pierwsze błędne jest to że napisałeś :
char wiersz[100];
a potem :
fgets(wiersz,300,wej);
to znaczy , że możliwe jest że jakieś 200 znaków zostanie zapisanych na niezarezerwowanej dla nich pamięci !!!! Co może być przyczyną dosłownie wszystkiego . jak już piszesz : wiersz[100] , to musisz potem napisać również : fgets(wiersz,99,wej) .
Błąd jest następujący :
W strukturze masz same wskaźniki do tekstów . A w kodzie nigdzie nie alokujesz dla nich pamięci !! Masz jedną wspólną tablice : wiersz[] , za każdym razem gdy czytasz dane z pliku to tekst idzie do tej tablicy , a konkretne wskaźniki ( imie , nazwisko , itd ) wskazują na odpowiednie miejsca tej tablicy . Ale jak wczytasz dane następnej osoby to tablica wiersz[] zostanie nadpisana , wskaźniki ze struktur poprzednich osób będą wskazywac na to samo miejsce w pamięci , ale tam będą już inne dane ( dane ostatnio wczytanej osoby ) , co objawia sie tym że w ostatniej pętli pokazywane jest to samo imie ...

[dopisane]
Mam dla ciebie o wiele prostrze rozwiązanie , wykorzystaj :
fread() i fwrite() .
Strukture zadeklarj sobie np tak :

struct elem {
char imie[20];
char nazwisko[20];
char tel[20];
char adres[40];
char miejscowosc[20];
struct elem *nast;
struct elem *poprz;
};

jak chcesz zapisać tą strukture do pliku to piszesz :
struct elem osoba1;
FILE *plik;
fwrite(&osoba1,sizeof(struct elem),1,plik); //strukture osoba1 zapisuje do pliku plik
//a jak chcesz ją odczytać z pliku to piszesz po prostu :
fread(&osoba1,sizeof(struct elem),1,plik); //czyta jedną strukture elem do struktury osoba1
Banalnie proste i przyjemne ;)
Tylko takiego pliku plik nie mozesz sam edytować , są to pliki zdefiniwane i program zapisuje sobie tam dane w określony sposób .
Więc odczytuj i zapisuj do nich tylko za pomocą fread i fwrite .
dzięki temu rozwiązaniu będzie ci łatwiej napisać tą liste , bo od razu wczytujesz całą strukture , a nie jedno pole po drugim . Mogą byc błędny bo pisałem z pamięci , jakby coś było nie jasne to pytaj

[*/Moderator prosi o używanie edycji własnych postów user image///]

0

Zgadzam sie , wlasnie wpadlem na to.
poza tym w tej strukturze musze byc chyba deklaracje konkretne tzn np. imie[iles tam].
Zrobilem tak i dziala
Dzieki

[dopisane]
Do Trouble:

Faktycznie prosta metoda , ja to zrobilem tak jak pisalem i nawet chodzi fakt ze moze jest sposob mniej stabilniejszy ale chodzi mi o zaliczenie przedmiotu na studyjach i mysle ze moj sposob jest bardziej pokopany wiec chyba "lepszy", oczyeiscie nie w praktyce ;-)
Dzieki za info
Pozdrowka

[*/Moderator prosi o używanie edycji własnych postów user image///]

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