verkettete Liste speichern/laden
-
Die Datei sieht ja wie folgt aus:
vname#nname#wohnort#plz#strasse#hausnummer#vorwahl#telnr
vname#nname#wohnort#plz#strasse#hausnummer#vorwahl#telnr
vname#nname#wohnort#plz#strasse#hausnummer#vorwahl#telnr
u.s.w.die erste Zeile kann ich einlesen, aber wie springe ich dann zur 2. Zeile?
-
wie du im CodeAusriss siehst ist da ein
while(fgets(buffer0,BUFFERLEN,ifp) { ... }
dies sorgt dafür das ganze file Zeile für Zeile gelesen und verarbeitet wird
Deine Demodatei sollte zumindest so aussehen
vname1#nname1#wohnort1#plz1#strasse1#hausnummer1#vorwahl1#telnr1 vname2#nname2#wohnort2#plz2#strasse2#hausnummer2#vorwahl2#telnr2 vname3#nname3#wohnort3#plz3#strasse3#hausnummer3#vorwahl3#telnr3 u.s.w.
Ich würde fürs debugging die Funktion ParseOneline wie folgt abändern
Damit du sehen kannst welche Zeile er gerade Beabeitetint ParseOneline(char *Buffer,PersSTRUCT *Data) { // Buffer vname#nname#wohnort#plz#strasse#hausnummer#vorwahl#telnr\r\n printf("\nDebugAusgabe gelesen:]%s[", Buffer) ....
Außerdem würde ich mir eine Funktion schreiben die den Inhalt der gesamten Liste auf dem Bildschirm ausgibt, damit
kann man überprüfen ob das Lesen korrekt erfolgt, wenn man sie vor das Ende der while Schleife in den Code einfügt.
-
Hi, irgendwie funktioniert es noch nicht.
So sieht es bei mir bis jetzt aus:datei = fopen("benutzer.txt","rb"); zeiger=anfang; while(fgets(buffer0,BUFFERLEN,datei)) { if(anfang == NULL) { anfang = (struct person*) malloc (sizeof(struct person)); ParseOneline(buffer0,data); anfang=data; anfang->next=NULL; } else { while(zeiger->next != NULL) zeiger=zeiger->next; zeiger->next= (struct person*) malloc (sizeof(struct person)); ParseOneline(buffer0,data); zeiger=data; zeiger->next=NULL; } } fclose(datei);
und
int ParseOneline(char *Buffer,struct person *data) { substr(Buffer,data->vname,'#'); substr(Buffer,data->nname,'#'); substr(Buffer,data->wohnort,'#'); substr(Buffer,data->plz,'#'); substr(Buffer,data->strasse,'#'); substr(Buffer,data->hausnummer,'#'); substr(Buffer,data->vorwahl,'#'); substr(Buffer,data->telnr,'#'); return 0; }
- anfang heißt bei mir das erste Listenelement
- zeiger die anderen
-
Das es nicht funktioniert ist schade.
Was funktioniert denn nicht, wenn ich diese Information hätte könnte ich vielleicht helfen.
- Comnpiler Fehler ?
- Runtime Fehler ?
- Falsche Daten ?Nicht böse sein, bin neugierig aber leider keine Hellseher
-
Ist ein Runtime-Fehler:
"Unbehandelte Ausnhame :System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
at substr(SByte* in, SByte* lowout, Sbyte search)
at ParseOnline(SByte* Buffer, person* data)
at main()"
-
Wenn ich das richtig interpretiere ist ein teil der Parameter von substr leer. das kann eigentlich nur buffer sein
Setz doch bitte vor jedes substr die folgende Zeile printf("Inhalt von Buffer ]%s[\n",buffer);
Damit wir sehen wie der gelesene Buffer aussieht vor während und nach dem zerlegen aussiehtint ParseOneline(char *Buffer,struct person *data) { printf("Inhalt von Buffer ]%s[\n",buffer); substr(Buffer,data->vname,'#'); printf("Inhalt von Buffer ]%s[\n",buffer); substr(Buffer,data->nname,'#'); printf("Inhalt von Buffer ]%s[\n",buffer); substr(Buffer,data->wohnort,'#'); printf("Inhalt von Buffer ]%s[\n",buffer); substr(Buffer,data->plz,'#'); printf("Inhalt von Buffer ]%s[\n",buffer); substr(Buffer,data->strasse,'#'); printf("Inhalt von Buffer ]%s[\n",buffer); substr(Buffer,data->hausnummer,'#'); printf("Inhalt von Buffer ]%s[\n",buffer); substr(Buffer,data->vorwahl,'#'); printf("Inhalt von Buffer ]%s[\n",buffer); substr(Buffer,data->telnr,'#'); printf("Inhalt von Buffer ]%s[\n",buffer); return 0; }
-
wo kommt bei die in dem Stück data her, ich glaube mein erster Verdacht war falsch, dein Data zeigt wahrscheinlich auf NULL
while(zeiger->next != NULL) //<=== Wofür das while?? du hängst beginnend vom ersten element ein Element zeiger=zeiger->next;// nach dem anderen an somit zeigt zeiger->next auf NULL zeiger->next= (struct person*) malloc (sizeof(struct person)); // ein malloc ohne Fehlerhandling Fast eine Todsünde ParseOneline(buffer0,data); //<========== hier müste zeiger stehen zeiger=data; zeiger->next=NULL; }
-
Also, wird einmal der Inhalt von "Buffer" ausgegeben und dann bricht das Programm mit einem Fehler ab.
Wenn ich noch vor das 1. printf
data = (struct person*) malloc (sizeof(struct person));
schreibe, werden 4 Zeilen ausgegeben und dann bricht das Programm ab!
-
wie sehen diese 4 Zeilen vom Inhalt aus?
-
ja, das while am Anfang muss weg. Ich hab ein bisschen Quellcode von einer Funktion kopiert, die ich auch mit eingearbeitet habe. Ist mit "reingerutscht"
zu dem Fehlerabfang - stimmt, wirklich ziemlich leichtsinnig!
-
funktionierts denn jetzt???
-
PAD schrieb:
funktionierts denn jetzt???
Nö!
PAD schrieb:
wie sehen diese 4 Zeilen vom Inhalt aus?
Auf dem Bildschirm wird folgendes ausgegeben:
Inhalt von Buffer ]vname1#nname1#wohnort1#plz1#strasse1#hausnummer1#vorwahl1#telnr1[
Inhalt von Buffer ]nname1#wohnort1#plz1#strasse1#hausnummer1#vorwahl1#telnr1[
Inhalt von Buffer ]wohnort1#plz1#strasse1#hausnummer1#vorwahl1#telnr1[
Inhalt von Buffer ]plz1#strasse1#hausnummer1#vorwahl1#telnr1[Danach kommt wieder die gleiche Fehlermeldung von vorhin!
-
ist data-plz ein string oder eine Integer????
-
integer
-
Dann ist ja klar was passiert man kann einer Integer keinen pointer of char zuweisen
Lösung 1 schon mal erwähnt mach nen String draus
Lösung 2 dieses Verfahren an allen Stellen an denen du Integers benutzt (strol wäre besser atol tuts aber)char buffer1[1024 +1]; ... substr(Buffer,buffer1,'#'); data->plz=atol(buffer1); printf("Inhalt von Buffer ]%s[,]%s[, %li\n",buffer,buffer1,data->plz);
-
Hi, also datei wird jetzt schonmal komplett geladen. Ich hab mich für die Variante entschieden, alle werte in char zu ändern.
Wenn ich jetzt aber die geladenen Daten anzeigen lassen will, wird nix bzw nur Mist angezeigt.
Komisch ist auch, dass auf dem Bildschirm jetzt folgendes ausgegeben wird:
Inhalt von Buffer ]vname1#nname1#wohnort1#plz1#strasse1#hausnummer1#vorwahl1#telnr1
[
Inhalt von Buffer ]nname1#wohnort1#plz1#strasse1#hausnummer1#vorwahl1#telnr1
[
Inhalt von Buffer ]wohnort1#plz1#strasse1#hausnummer1#vorwahl1#telnr1
[
Inhalt von Buffer ]strasse1#hausnummer1#vorwahl1#telnr1
[
Inhalt von Buffer ]hausnummer1#vorwahl1#telnr1
[
Inhalt von Buffer ]vorwahl1#telnr1
[
Inhalt von Buffer ]#telnr1
[
Inhalt von Buffer ][Wurde da irgendwie ein newlinezeichen oder so mit gespeichert, welches jetzt die Werte verändert?
-
Für mich sieht das ganz positiv aus.
Es wird während des Lesens, jeweils der noch nicht bearbeitete Teil des Inputbuffers angezeigt.
Das am Ende ein \n steht ist auch erwartet und korrect.
damit du den Inhalt der einzelnen Elemente sehen kannst, solltest du die PrintZeiger Routine die ich schon mal angesprochen
habe implementieren.
Am Ende von data->telnr mußt du noch das \n entfernen
Frage hast du die Datei mit "rt" oder "rb" geöffnetFalls "rt" dann data->telnr[strlen(data->telnr)-1)=0x00;
Falls "rb" dann data->telnr[strlen(data->telnr)-2)=0x00;int ParseOneline(struct person *data) { printf("data->vname]%s[\n",data->vname); printf("data->nname]%s[\n",data->nname); .... return 0; }
Wenn du jetzt in deiner Datei mehrere Zeilen hast sollte für jede beim Lesen diese Ausgabe aus ParseOneLine kommen.
Es würde sinn machen neben dem Restbuffer auch den jeweils gelesenen Teil anzuzeigen, das ist eine triviale Erweiterung
von printf.
-
habs mit rb geöffnet, aber der strlen-Befehl funktioniert so nicht. Hast du da einen Schreibfehler drin? Hab nämlich alles Mögliche schon probiert
-
Natürlich die jeweils letzte Runde sollte eine ] sein.
Hättste aber auch selber anhand der Compiler Meldung korrigieren können
-
So, jetzt funktioniert endlich alles - ich danke dir wie verrückt!!!