frage zu strtok
-
Malzeit !!
Ich bin dabei einen Parser zu schreiben.
Dieser soll jede Zeile durchgehen und prüfen um was für eine Variable es sich handelt und dann die danach stehenden Werte einlesen.
Währen alle Variablen(kombinationen) gleich lang währe es ja kein Problem.
Die Namen sind aber mit Lehrzeichen in ihre Einzelbedeutungen getrennt:bsp:
Global Wert Unterwert [345] Lokale Werte [230][234]
Außerdem sind evtl. Tabs eingefügt, um die Datei übersichtlich zu lassen.
Mit strtok kann man ja wunderbar Wörter zwischen zwei Zeichen auseinanderpflücken.
das Problem ist aber, daß nach dem letzten Wort ein Leerzeichen oder ein Tabulator stehen kann. Ich bräuchte innerhalb der strtok Funktion also eine ODER Auswertung. oder eine anderen Weg um festzustellen, daß das letzte Wort vorbei ist (dieses mus natürlich auch eingelesen und verglichen werden) und um zu wissen, daß jetzt die Werte anfangen.Mit:
ausgang = strtok(0,"["||" "); oder: ausgang = strtok((0,"[")||(0," "));
gehts leider nicht.
Hat jemand von euch ne andere Idee oder weiß wo ich ein paar brauchbare Infos übers Programmieren von parsern herbekomme??
Grüße,
Lutz
-
mach doch einen zeilenumbruch mit rein, dann müsste es gehen
ausgang = strtok(0,"\n"); // plus deine zeichen
-
mit strtok wird parsen zur qual.
schau ma boost::spirit an, das ist ein kleiner parser für alle lebenslagen
-
Danke schonmal für die schnellen Antworten.
@ miller_m:
Das Input File muß schön übersichtlich aussehen. Daher kann ich leider nicht Pro Zahl eine Zeile verwenden.
Das klingt sehr gut. Das Dumme ist nur, daß man diese Libary käuflich erwerben muß wenn man sie komerziell nutzt.
Ich muß es also leider irgendwie von hand machen
Die anfängliche Freude über strtok ist auch bei mir schnell gewischen.
Grüße,
Lutz
-
dann teste doch den rückgabewert auf gültigkeit
char *ptr = strtok(pData, "\n"); while(ptr != 0) { // verarbeiten ptr = strtok(0, "\n"); }
-
Das ist zwar nicht ganz mein Problem, hilft mir aber trotzdem weiter.
Es geht ja um den Zwischenraum zwischen Variablennamen und Werten.
Also:
Bezeichnung{Leerzeichen}Unterbezeichnung{Leerzeichen}Unterbezeichnung{Leer oder Tab}[Wert][Wert]{Umbruch}
Dein Code kann ich aber auch sehr sinnvoll einsetzen. ich werds gleich mal versuchen.
Danke
-
SecretAgentMan schrieb:
Das ist zwar nicht ganz mein Problem
wo hagt es denn noch?
SecretAgentMan schrieb:
Bezeichnung{Leerzeichen}Unterbezeichnung{Leerzeichen}Unterbezeichnung{Leer oder Tab}[Wert][Wert]{Umbruch}
so müsste es gehen (denk ich)
strtok(pData, " \t[]\n");
-
Jippi!
Jetzt gehts!!Dein letzter Beitrag war des Rätsels Lösung.
Dein Vorletzter Beitrag sollte das Problem der Sequmentation faults, wenn eine Leerzeile auftritt, beheben.Danke und schöne Grüße,
Lutz