Doppelt verkettete Liste; Kleines Problem beim Einlesen = große Fehlerwirkung?!
-
Hallo,
ich habe eine List.txt die im Programmverzeichnis liegt. Inhalt:
Helmut Kohl 40 0428/39843
Julia Lamm 19 0423/324826
Vanessa Schmitt 18 042/22343
Malte Hackl 23 3452/62346
Petra Hauser 31 2343/234Die will ich nun mit dieser Funktion einlesen:
// Testphase ///////////////////////////////////////////// void ReadList() { ifstream List("List.txt"); if(List) { char vorname[80], name[80], alter[80], telefonnummer[80]; // Solange das Ende der Liste nicht erreicht ist weiter hinzufügen while(!List.eof()) { List>>vorname; List>>name; List>>alter; List>>telefonnummer; AddPerson(vorname, name, alter, telefonnummer); } List.close(); cout<<"Liste erfolgreich eingelesen!\n-----------------------------\n\n"; } else cout<<"Datei konnte nicht eingelesen werden!\n"; }
Natürlich soll daraus wieder die ehemals vorhandene verkettete Liste enstehen was scheinbar auch klappt, allerdings liest er den letzten Eintrag 2x ein, so sieht das einlesen aus:
http://mitglied.lycos.de/inselkampf/c++/liste.jpg
Wie zu sehen der letzte Eintrag wird 2x eingelesen, ich vermute das darin der Fehler liegt anders kann ichs mir nicht erklären.
Rufe ich nun ReadPerson() auf nachdem die Liste eingelesen wurde kann ich grundsätzlich nur auf die Letzte Person zurückgreifen und auch nicht mehr mit PrevPerson() eine Person vor springen.
Das klingt jetzt sicherlich alles schrecklich verwirrend darum könnt ihr euch hier den Quelltext auskommentiert mit Beispielen herunterladen:http://mitglied.lycos.de/inselkampf/c++/Programm.zip
Die meisten Funktionen hab ich rausgeschnitten damits net zu verwirrend ist!
Die Funktionen AddPerson und InitList sind DEFINTIV zu 100% richtig, füge ich einträge per "hand" hinzu klappt alles!
Wie gesagt schaut euch den Code an, in der main stehen Hinweise wie das Programm funktioniert und ich hoffe einer von euch findet den Fehler.Ich bin unfähig
und weiß nicht mehr weiter.
vielen dank!
-
Ach ja, theoretisch, dass ist ja das tolle an funktionen, würde es reichen wenn mir einer diese Funktion:
// Testphase ///////////////////////////////////////////// void ReadList() { ifstream List("List.txt"); if(List) { char vorname[80], name[80], alter[80], telefonnummer[80]; // Solange das Ende der Liste nicht erreicht ist weiter hinzufügen while(!List.eof()) { List>>vorname; List>>name; List>>alter; List>>telefonnummer; AddPerson(vorname, name, alter, telefonnummer); } List.close(); cout<<"Liste erfolgreich eingelesen!\n-----------------------------\n\n"; } else cout<<"Datei konnte nicht eingelesen werden!\n"; }
richtig schreiben würde. An AddPerson müsste einfach immer der vorname, name, das alter und die telefonnummer von einem listeneintrag übergeben werden.
Dann zum zweiten springen usw. bis die list.txt abgearbeitet ist.
-
Hi,
das Problem liegt in Deiner Liste selber. Insbesondere bei AddPerson:
void AddPerson(char *vorname, char *name, char *alter, char *telefonnummer) { if(personavaiable) { Person *Object; Object = new Person; Object->vorname = vorname; Object->name = name; Object->alter = alter; Object->telefonnummer = telefonnummer; Object->pPrevPerson = pCurrentPerson; Object->pNextPerson = NULL; pCurrentPerson->pNextPerson = Object; pCurrentPerson = Object; ReadPerson(); } else InitList(vorname,name,alter,telefonnummer); }
Du kannst C-Strings nicht einfach nur mit = Zuweisen. In Deiner Funktion kopierst Du nur Adresse auf die Arrays in ReadList sprich:
char vorname[80], name[80], alter[80], telefonnummer[80];
der Inhalt der Variablen ändert sich dann aber in dem nächsten Schleifendurchlauf.
Ein kleiner Tipp, wenn Du Dich schon mit Klassen beschäftigt hast, dann Kapsel die Liste doch in eine Klasse. das macht den Code übersichtlicher. So wie er jetzt ist, sieht man ja kaum durch.grüße Con@n
-
Ich weiß das es immer schwer ist fremden Code zu blicken.
Aber du hast Recht, jetzt sehe ich den Fehler allerdings weiß ich nicht wie ich das umgehen kann.
Als erstes werde ich mir jetzt wohl erstmal Klassen anschauen.Hast du evt. noch eine Idee wie ich es erstmal so zum laufen bekommen könnte?
-
wenn Du die Zeichenketten kopieren willst, dann mit strcpy aus der <cstring>. Also statt
ziel=quelle
strcpy(ziel,quelle)
dann darfst Du aber nicht vergessen, vorher mit new genügend Speicher bereitzustellen.
grüße Con@n
-
Dann bräuchte ich noch einmal deine Hilfe
In C geht das so:
Person *Object; Object = malloc (sizeof(*Object)); Object->vorname = malloc (strlen(vorname)); strcpy(Object->vorname, vorname);
aber warum geht das in c++ dann nicht einfach so?
Person *Object; Object = new (sizeof(*Object)); Object->vorname = new (strlen(vorname)); strcpy(Object->vorname, vorname);
-
new ist da etwas anders als malloc
Person *Object = new Person; Object->vorname = new char[strlen(vorname)+1] // +1 muss sein, wegen dem abschließendem Nullzeichen;
grüße Con@n
-
Hallo,
mal die Antwort aus
http://www.c-plusplus.net/forum/viewtopic.php?t=57215&highlight=list+vorname
versucht ?
-
alter ich könnte dich totknuddeln
Es klappt! Ich fass es nicht! Wenn ich noch ein paar Fragen haben sollte melde ich mich einfach wieder ! Super Hilfe !
-
Ja, habe ich!
Allerdings müsste ich mein Programm komplett umstrukturieren und das wollte ich doch nicht!
Aber auf einige gute Ideen hast du mich damit gebracht!
-
Ich erwähne es lieber noch einmal:
Die Hilfe von euch beiden war echt super, ich will euch ermutigen weiter so gute, qualifizierte Hilfe zu leisten!
Schöne arbeit jungs!
-
Der beste Dank ist wenn Du Dich registrierst und ebenfalls mit Deinem Wissen anderen hilfst
-
Aber das mit dem Knuddeln sollten wir verschieben. Du kannst ja mal Deine Freundin vorbeischicken
. zum knuddeln
grüße Con@n