datei byte für byte interpretieren.
-
hallo alle zusammen,
wir sollen eine datei byte-weise einlesen und interpretieren. nur weis ich nicht wie ich das anstellen soll.die datei hat folgeneden aufbau:
jede zeile steht für eine element, das so aussieht
[interner paramter] "id" "name" ["aktion"]
die aktion und der parameter sind nur optional. sie müssen nicht in jedem eintrag vorhanden sein.unter jedem element kann nun ein child folgen. dieses wird in geschweifte klammern gesetzt, wie in c, { = blockanfang } = blockende.
in jedem child-block können wieder beliebig viele elemente, gleichen aufbaus, stehen. dies bis in eine tiefe von 255 childs.das ganze sol dann irgendwie in einer liste gespeichert werden, damit man einfach drauf zugreifen und schreiben kann.
in php würde ich das per array machen, aber mehr-typen-arrays gehen ja nur in scriptsprachen. nicht in c.ich habe gehört sowas geht über grammatik-zerlegung - nur davon habe ich auch keine ahnung. kann mir da einer helfen? ich hab keine ahnung wie ich das schaffen soll. die datei darf nicht zeilenweise eingelesen werden.
bsp:
"0" "eintrag 1" { "0" "eintrag 1.1" "exec funktion" "1" "eintrag 1.2" { ONLY_IN_DEBUG "0" "eintrag 1.2.1" "aktion" } } "1" "eintrag 2" "exec write -hallo-" "2" "eintrag 3" { "0" eintrag 3.1" "..." }p.s.: die einrückung und trennung kann per leerzeichen oder tabs erfolgen. die einrückung kann, unter umständen, auch wegfallen.
wäre sehr dankbar über jede hilfe.
danke im voraus.
Uni_Sol
-
Sehe ich das richtig, daß jeder Eintrag eine eigene Zeile bekommt? Wenn ja, kannst du die Datei stückweise mit getline() zeilenweise einlesen und die Zeilen dann nach ensprechenden Mustern absuchen.
(PS: mit "str=str.substr(str.find_first_not_of(" \t");" kannst du notfalls die Einrückungen abschneiden.)
Edit: Ich habe das
die datei darf nicht zeilenweise eingelesen werden.
wohl übersehen

In dem Fall kannst du das auch manuell nachbilden:string str; ifstream fin("datei.txt"); while(fin) { char c; fin.get(c); if(c=='\n') { //werte Zeile aus str=""; } else str.push_back(c); }