fehler mit strcpy beim Auslesen aus txt Dateien
-
Hallo Stockhausen,
ich kann den Frust von SeppJ verstehen, mir geht es ja ähnlich, obwohl ich solche Situationen inzwischen mehr mit einem lachenden denn mit einem weinenden Auge hinnehme. Ich akzeptiere aber auch Deinen Wunsch wissen zu wollen, warum Dein Programm nicht funktioniert.
Ganz vordergründig geht es in der Funktion ladeperson schief, weil Du hier ohne Zustandskontrolle (Variable zustand) auf ein '"' reagierst, welches aber pro Zeile mehr als einmal vorkommt.
Ein einfacher Hack dieses Fehlers (Fehlerbehebung wäre vermessen) besteht darin, hinter der Zeile 97 noch folgendes einzufügen:strcpy(fest->identifikation,puffer); // Zeile 97 datei.ignore( 9999 /*maximal so viel Zeichen*/, '\n' ); // <-- neu return fest; // <-- neuda identifikation, der letzte Member ist, der gelesen ist, so wird anschließend einfach der Rest der Zeile ignoriert, und dann die Funktion verlassen. Mit der Datei, die Du hier gepostete hast, funktioniert das dann.
Zeile 97 ist übrigens eine sehr interessante Stelle. Genau hier wäre es nämlich möglich, mit einer wohl präperierten Datei 'personen.txt' den PC zu kapern, auf dem dieses Programm läuft. Wenn die Benutzerrechte reichen, kann ein eingeschleustes Programm hier alles machen, was ein Programm auf einem PC machen kann - vom Versenden von tausenden von SPAM-Mails mit Deinem Account als Absender bis zum Formatieren der Festplatte.
arghonaut schrieb:
Stockhausen schrieb:
Wenn ich Klavier spielen lerne, versuche ich mich auch nicht an dem Presto Satz aus der Beethoven-Mondscheinsonate.
Und da liegt das Problem: Du baust dir gerade ein Klavier...
das war auch mein Gedanken, bevor ich die Beiträge dazu gelesen habe!
Stockhausen- es ist Dir sicher nicht bewusst - aber Du versuchst tatsächlich, Dir die Funktionen zusammen zu bauen, die es schon gibt und mit denen Du spielen kannst, wenn man es denn kann.
Vielleicht ein Anfang: Gebe den Membern name und identifikation den Typ std::string. Du benötigst dann noch ein #include <string>. person wird dann zu
struct personen { struct personen *naechster; std::string name; int ordnungsnummer; std::string identifikation; } ;Anschließend musst Du die Zeilen 88 und 97 anpassen:
fest->name = puffer; // vorher: strcpy(fest->name,puffer); .... fest->identifikation = puffer; // vorher: strcpy(fest->identifikation,puffer);Dann kannst Du auch auf das #include <string.h> verzichten.
Gruß
Werner
-
Hey,
danke für die weiteren Vorschläge! Ich werde mich damit näher befassen, doch im Moment komme ich noch nicht dazu.
grüße
Stockhausen
-
Hallo Zusammen,
ich habe mich auch mal an der Aufgabe versucht, doch leider funktioniert sie noch nicht ganz. Ich habe mich darum bemüht, die Ratschläge zu befolgen, aber ich bin auch nur eine Anfängerin...
Mir ist zwar bewusst, dass der Beitrag schon was länger her ist, aber ich dachte, ich versuche mal mein Glück
#include <iostream> using namespace std; #include <string> #include <stdlib.h> #include <fstream> struct personen { struct personen *naechster; std::string name; int ordnungsnummer; std::string identifikation; } ; enum zustand {imON,imNamen,imID}; struct personen *ladedaten(ifstream &datei); struct personen *ladeperson(ifstream &datei); int main() { struct personen *wurzel=NULL; ifstream datei; datei.open("personen.txt"); wurzel=ladedaten(datei); while(wurzel!=NULL) { cout << wurzel->name << " besitzt die " << wurzel->ordnungsnummer << "mit der Identifikation " << wurzel->identifikation << "." << endl; wurzel=wurzel->naechster; } } struct personen *ladedaten( ifstream &datei) { struct personen *wurzel=NULL, *jetzt, *neu; while(!datei.eof()) { neu=ladeperson(datei); if (neu!=NULL) { if (wurzel==NULL) wurzel=neu; else jetzt->naechster=neu; jetzt=neu; } } return wurzel; } struct personen *ladeperson( ifstream &datei) { struct personen *fest; char puffer[100],zeichen; int zaehler; enum zustand zustand; fest=new struct personen; fest->naechster=NULL; zustand=imON; zaehler=0; for (;;) { datei.get(zeichen); if (datei.eof()) break; switch(zeichen) { case '"': puffer[zaehler]='\0'; zaehler=0; fest->ordnungsnummer=atoi(puffer); zustand=imNamen; break; case '(': if (zustand!=imON) { puffer[zaehler]='\0'; zaehler=0; fest->name = puffer; zustand=imID; } break; case ')': if (zustand!=imON) { puffer[zaehler]='\0'; zaehler=0; fest->identifikation=puffer; } puffer[zaehler]='\0'; zaehler=0; break; default: puffer[zaehler]=zeichen; zaehler++; break; } } }
-
"funktioniert nicht so ganz" ist keine brauchbare Fehlerbeschreibung.
-

Die Fehlermeldung lautet: "no return statement in function returning non-void"
Das Programm wird zwar durchlaufen, allerdings wird nichts ausgegeben.
-
... Hast du die Fehlermeldung mal VERSUCHT zu verstehen?
-
Ich sehe gerade, dass ich das Ende vergessen habe.
Müsste folgendes sein:struct beziehungen *sucheid(struct beziehungen *wurzel, char *bezeichnung) { while (wurzel != NULL) { if (!strcmp(wurzel->pate, bezeichnung)) return wurzel; wurzel = wurzel->naechster; } return NULL; }
-
Allerdings erhalte ich die Fehlermeldung:
invalid conversion from 'int' to 'const char*'
-
C.plusplus schrieb:
Allerdings erhalte ich die Fehlermeldung:
invalid conversion from 'int' to 'const char*'Wo erhältst du diese?
Damit das nicht so weiter geht, dass wir dir ständig alles aus der Nase ziehen müssen, lies mal dies durch:
https://www.c-plusplus.net/forum/200753
https://www.c-plusplus.net/forum/304133
http://www.tty1.net/smart-questions_de.html
-
if (!strcmp(wurzel->pate, bezeichnung)) return wurzel;Ich sehe in deinem code keinen pate.
Außerdem kenn ich nur einen Paten und der duldet keinen Widerspruch. Nicht einmal von einem Compiler.EDIT:
Du postest hier willkürlich ausgeschnittene/zusammengebastelte Codefragmente aber unglücklicherweise sind 99% der Forenmitglieder keine Hellseher.