Struct parsen ?

Ich möchte die Konfiguration eines Programmes, dass in einem Struct abgelegt ist in einem File speichern.
Wie fang ich das an, wenn dieses Schreibprogramm nur die Structur übergeben bekommt, sie also selbst parsen muß.

Im Prinzip läuft es m.E. auf die Frage hinaus, wie ich auf das x. Element einer Structur zugreifen kann ohne dessen Namen und seinen Datentyp zu kennen.

Bsp.
struct Person { char Name[], char Vorname[], int Alter}

Sinn: Ich möchte beim Ändern des Structs nicht jedesmal das Schreib- und Leseprogamm anpassen müssen.

vielleicht mit XML ein template anlegen und dann ein allgemeines schreib lese system für eben solch ein template . Oder bau dir dein eigenes template system :smile:

einfacher wirds dadurch aber in der testphase nicht :smile:

Schon mal über eine andere Implementierungssprache als C++ nachgedacht? Es ist praktisch eine Grundeigenschaft der Sprache C++, dass es ihr an Reflektionsmöglichkeiten, also Möglichkeiten zu Laufzeitbetrachtungen über ihre eigenen Datenstrukturen und sonstigen Elemente, fehlt. Im Gegensatz zu Objective C, Java, der Dotnet-Welt, Python, Perl, Ruby, Lua, und und und.

Die beste Möglichkeit wäre noch, die Header-Datei, die die struct enthält, zur Kompilierungszeit zu parsen und zu ihr passenden Code zu generieren. Das Tool dazu schreibt man entweder selbst, oder man nimmt einen existierenden Wrapper-Generator. Der Wrappergenerator SWIG (http://www.swig.org/) liefert z.B. Bindings für alle möglichen Skriptsprachen, die Reflektionsfähigkeit aufweisen. Nur für die struct wäre es wohl overkill, aber damit gewinnt man generell Skriptbarkeit.

Grüße,
Sebastian

Ich möchte die Konfiguration eines Programmes, dass in einem
Struct abgelegt ist in einem File speichern…
Sinn: Ich möchte beim Ändern des Structs nicht jedesmal das
Schreib- und Leseprogamm anpassen müssen.

Hallo,

davon würde ich abraten - die Anpassung ist immer noch das Einfachste, auch wenn man sie mal vergessen kann. Sonst müsste man alles um Namen und Typinformationen erweitern, das ist ein erheblicher Mehraufwand und gepflegt werden muss es auch.

Einfache Alternative: man kümmert sich überhaupt nicht um den Inhalt, sondern speichert die Struktur binär ab (in Hexdarstellung oder gleich als Reg_Binary), dann ändert sich nur die Länge.

In jedem Fall sollte man am Anfang der Struktur eine Versionsnummer unterbringen.

Gruss Reinhard

Danke an alle!
Es sind ein paar interessante Ideen dabei. Binary möchte ich nicht, da man das config manuell anpassen können soll.
Ein Versionnr ist schon mal gut.
XML wäre wohl wohl gut, kenn ich mich aber noch nicht so aus.
Möglicheweise ist eine an das Struct angepasste Schreibfunktion, die neben Name und Wert noch Typ und Adresse/Offset angibt, das einfachste.
Allerdings gibts dann bei Struct-Änderung Probleme … aber damit muß man wohl leben.

Hallo Steffen,

schreib die Daten doch einfach als

fprintf(F, „feld = %d\n“, mystruct.feldname);

raus und lade sie später z. B. via fscanf wieder (falls die Anwendung sicherheitskritisch ist, besser zeichenweises fgetc verwenden).

Wenn sich die Struct mal ändert, mußt du jeweils nur zwei Zeilen einfügen: ein fprintf und ein fscanf.

Oder du legst die Struktur-Definition wirklich separat in eine .h-Datei und erzeugst daraus mit einem kleinen Hilfsprogramm die Lade- und Speicherquellcodes.

Ciao
Elizar