Was muss ein FormatReader unterstützen???
-
Hallo und ein frohes neues Jahr für alle,
ich bin mir nicht ganz sicher ob es das richtige Forum ist und bitte um einen Hinweis falls es nicht der Fall sein sollte (immerhin können die Spieleprogrammierer nicht für alles herhalten).
Ich bastle mir ein einfaches PingPong Spiel und versuche das Grundgerüst so weit wie möglich neutral und erweiterbar zu gestalten.
Als nächtss steht eine Dateibehandlungsklasse an.
Eigentlich nur um .ini dateien zu lesen aber meine Idee ist jetzt eine art Basisklasse zu schreiben die grundlegendes kann und dann von dieser zu erben.Es ist das erste mal das ich mich in diese Gewässer begebe und wollte nur ein paar Ideen sammeln, was man braucht und ob es sich überhaut lohnt da die Formate ja sehr unterschiedlich sein können. Mir geht es um erweiterbarkeit und wiederverwendung. Zuallererst brauche ich das .ini und das .ace (3d daten)Format. Also nur Textbasierte Formate.
Bitte postet alles was wichtig ist.
-
-open
-close
-readline
-endoffile?alles andere duerfte sehr format abhaengig sein und gehoert wohl nicht in eine generische klasse, ich wuerde auch nicht viele hierarchieen in die vererbung vom formatreadern einbauen, sondern basis reader und dann immer fuer das passende format, da sich die formate dermassen unterscheiden dass kaum was nuetzliches geerbt werden kann.
stattdessen wuerde ich an deiner stelle eine string helperklasse schreiben. die noetigen funktionen sind oft in verschiedenen weisen gebrauchbar, z.b.
tokenizer der dir aus einem std::string dann z.b. ein std::vectorstd::string mit den einzelen teilen generiert
z.b. fuer (z.b. aus deiner ini datei).
pos = 0, 0, 0
kannst du
typedef std::vector<std::string> tdTokens; tdTokens Toks=Helper::Tokenize(Reader.ReadLine(),"=");
nutzen um den parameter von den einzelnen attributen des parameters zu trennen.
danach kannst du das selbe mit Tokenize(Toks[1],","); machen um x y z zu trenne.dann brauchst du oefter mal nen trimmer mit dem du z.b. am anfang, am ende oder grundsaetzlich alle zeichen eines typs entfernen kannst, z.b. leerzeichen wenn du einen ini string eingelesen hast.
nuetzlich ist oft eine funktion um den string in lower oder uppercase zu bringen, wenn du nach etwas suchst.
im laufe der zeit findest du sicher viele dinge die oefter gebraucht werden, statt copy&paste, nimm dir die zeit und steck sie in deine helper klasse. das meiste ist oft nur ein wrapper fuer schon existierende stl dinge, in <algorithms> steckt das meiste.
du kannst dir ansonsten auch boost string anschauen, die haben auch viele nuetzliche string erweiterungen.
ich glaube das hier kann in c++ verschoeben werden, oder hast du graphik/spiele spezifische dinge die du wissen moechtest?
-
naja zum verschieben ist es schon zu spät du hast mir schon auf alle meine Fragen geantwortet. Vorallem hat mich interessiert wieviel die Basis unterstützen sollte. In diesem Sinne vielen Dank an rapso.
Gestern kamm mir noch die Idee eine Art intelligenten Parser zu realisieren.
Man könnte doch ein Format erstellen das alle anderen Formate beschreibt.Zum Beispiel eine Textdatei die beschreibt wie ein Key in einer Datei zu finden ist und wie ein Value. Dem Parser würde ich dann nur sagen - lies die Formatspecifikation in der Datei "iniSpec" und nimm dir dann die "XXX.ini" vor.
Danach könnte man sagen lies die Datei "aceSpec" und nimm dir dann "Cube.ace"vor.Natürlich ist mir klar das ich hier ziemliich weit aushole - aber es ist sehr interessant mit diesem Stoff zu arbeiten - mal sehen was daraus wird. Wie du schon gesagt hast, brauche ich erst mal eine HelperKlasse. Einiges habe ich schon aber da kann noch mehr rein.
!!!Vieleicht könnte einer der Admins diesen Thread doch noch verschieben - vielleicht brauche ich nochmal Hilfe.
Danke.
-
socco schrieb:
Gestern kamm mir noch die Idee eine Art intelligenten Parser zu realisieren.
Man könnte doch ein Format erstellen das alle anderen Formate beschreibt.Zum Beispiel eine Textdatei die beschreibt wie ein Key in einer Datei zu finden ist und wie ein Value. Dem Parser würde ich dann nur sagen - lies die Formatspecifikation in der Datei "iniSpec" und nimm dir dann die "XXX.ini" vor.
Danach könnte man sagen lies die Datei "aceSpec" und nimm dir dann "Cube.ace"vor.du kannst dir sicher denken dass du da auch nicht der erste bist mit dieser idee
es gibt da mehrere ansaetze.
1. jedes format hat eine ID und anhand dieser ID laedt man sich ein plugin dass dann den inhalt parser/verwenden kann. so in der art funktioniert z.b. AVI .
2. man embeded ein script was recht primitiv ist aber den eingabestream in einen nuetzlichen ausgabestream 'convertieren' kann.
3. man benutzt spezielle 'rules' die auf abstrakte weise eine sprache beschrieben. da gibt es dann mehrere ebenen.einlesen koenntest du dich in: (e)cfg, LALR, Lexer. in dem zusammenhang ist boost::spirit fuer simple dinge ein gutes helferlein.
Natürlich ist mir klar das ich hier ziemliich weit aushole - aber es ist sehr interessant mit diesem Stoff zu arbeiten - mal sehen was daraus wird. Wie du schon gesagt hast, brauche ich erst mal eine HelperKlasse. Einiges habe ich schon aber da kann noch mehr rein.
lass sie einfach mit der zeit wachsen waehren du deinen parser codest
!!!Vieleicht könnte einer der Admins diesen Thread doch noch verschieben - vielleicht brauche ich nochmal Hilfe.
Danke.ay ay
-
Dieser Thread wurde von Moderator/in rapso aus dem Forum Spiele-/Grafikprogrammierung in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
zu 1.
das wäre auch mein erster Ansatz gewesen, aber die Lösung ist auch das Problem,denn nicht jedes Format liefert eine ID. Man müsste also schon im SourceCode das Format übergeben. (Obwohl die Dateinameerweiterung eine soche ID sein könnte, oder?)zu 2.
immer hin und her zu Übersetzen klingt nach einem langsamen Loader.zu 3.
es gibt eigentlich nur vier elemte in einer Datei: einen Key das Value dazu, einen Sector (auch verschachtelt) und einen Kommentar.(Ist es richtig???)
Wenn ich für jedes Format das ich benutzen möchte die rules festlege wie man die vier sachen voneinander unterscheidet dann wäre es ein kompfortables Teil.
Keine Ahnung ob du das mit 3. gemeint hast.
Aufjedenfall danke erstmal.Eine Frage noch zum Grundsätzlichem: Sollte ich erstmal die Ganze Datei in einen riesen String lesen und dann den String zerknüpfen oder immer Zeile für Zeile und sofort in die map?