Speicherformat für mehrere Maps

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Speicherformat für mehrere Maps

    Halli hallo

    Ich bastele an einem kleinen Spiel und habe ein System zum Speichern und Laden von Maps erstellt.
    Dieses speichert eine Map in eine Datei in eine Zeile.
    Das Format kann mehrere Maps speichern, also jede Zeile repräsentiert eine Map(Also repräsentiert die Datei eine Art Mappack).
    Das Problem, ich möchte überprüfen, ob eine Map innerhalb der Datei schon existiert, dass ich also nicht eine Map 2x speichere.
    Nun, um das im jetztigen Zustand zu übeprüfen, müsste ich die gesamte Datei einlesen und die Map-Namen herausfiltern, was ja absurd ist.
    Ich hab mir gedacht, ich könnte ja am Anfang der Datei die Map-Namen eintragen und auslesen, dann müsste ich etwa nur die erste Zeile einlesen.
    Das Problem ist, ich kann ja nichts an den Anfang der Datei schreiben, lediglich am Schluss, oder komplett überschreiben(mit file_text...), was ja noch suboptimaler ist(alles einlesen, löschen und wieder reinschreiben).
    Gibt es keine Möglichkeit, am Anfang einer Datei etwas reinzuschreiben(Ich kenne zwar die Repräsentation von Dateien innerhalb der Festplatte nicht, könnte ja sein, dass die Festplatte die ganzen Daten davor nachvorne schieben müsste oder so..)?
    Andere Möglichkeiten?
    Gibt es Beispiele, wie es andere gelöst haben?
    Ich würde gerne mehrere Dateien vermeiden...

    Dankschön
    "das war meine letzte flamewar PM an dich ."
  • Zunächst mal würde ich dir davon abraten im textbasierten Modus zu arbeiten, sofern das Dateiformat nicht für einen Menschen einfach zu lesen sein soll. Also solche Dinge wie Zeilenumbrüche sind eher unschön zu behandeln wie ich finde. Wenn du im Binärmodus arbeitest hast du einige Vorteile. Z.B. ist es nämlich möglich eine Datei zum schreiben zu öffnen ohne den Inhalt zu löschen, um dann anschließen an beliebiger Stelle in der Datei Daten zu überschreiben. Einfügen hingegen ist schon von technischer Seite her nicht möglich. Denn dazu müssten alle nachfolgenden Daten nach hinten verschoben werden, was im Allgemeinen, also bei großen Dateien sehr ineffizient ist.

    Schau dir also am besten mal die file_bin Funktionen an. Damit kannst du mehr erreichen, als mit den textbasierten Funktionen. Ein wichtiges Hilfsmittel für den Aufbau eines binären Dateiformats sind auch Zeiger. Also Blöcke von gewöhnlich 4 oder 8 Byte, welche einen Integer repräsentieren und auf eine Position in der Datei verweisen. Beispielsweise könntest du dein Dateiformat so aufbauen:

    Quellcode

    1. [Zeiger auf Map 1 (8 Byte)]
    2. ...
    3. [Zeiger auf Map 2 (8 Byte)][Länge des Namens von Map 1 (4 Byte)][Name von Map 1][Länge der Mapdaten (8 Byte)][Mapdaten]
    4. ...
    5. [Zeiger auf Map 3 (8 Byte)][Länge des Namens von Map 1 (4 Byte)][Name von Map 1][Länge der Mapdaten (8 Byte)][Mapdaten]
    6. ...

    Die Maps werden sozusagen als verkettete Liste in der Datei gespeichert. "[Zeiger auf Map i (8 Byte)]" sind dabei jeweils die Zeiger auf das nächste Element. Diese Art der Speicherung hat folgenden Sinn. Falls du eine bestimmte Map suchst, musst du nicht den kompletten Inhalt der Datei lesen, sondern du springst von Zeiger zu Zeiger und liest jeweil nur den darauffolgenden Namen der Map. Die Mapdaten, die wahrscheinlich die größte Datenmenge beansprucht, musst du dabei noch nicht lesen. Somit kommst du also relativ schnell zu deiner Map. Zudem lassen sich natürlich auch einfach Maps hinzufügen, indem du die neue Map an das Ende schreibst und den entsprechenden Zeiger der vorigen Map überschreibst. Auch das löschen einer Map, oder das Vertauschen der Reihenfolge sind "relativ" einfach umzusetzen indem du einfach die entsprechenden Zeiger umlenkst. Beim Löschen einer Map bekommst du natürlich den Nachteil, dass einfach eine Lücke in der Datei entsteht, in der keine relevanten Daten stehen, die jedoch zur Größe der Datei auf der Festplatte beitragen. Auch das Speichern als verkettete Liste ist alles andere als optimal. Ich wollte damit nur mal darstellen in welche Richtung man sich technisch bewegen sollte.

    Beachten solltest du außerdem, dass die file_bin-Funktionen des GM erwartungsgemäß sehr langsam sind. Zudem hast du bei dessen Verwendung im Gegensatz zu den file_text-Funktionen den Nachteil, dass du keine Zeichenketten lesen und schreiben kannst, sondern nur Zeichen für Zeichen. Nimmt man das jedoch in Kauf, kann man mit den file_bin-Funktionen einiges erreichen.
  • Hey danke, klingt sehr angenehm mit den Pointern(Obwohl ich mir da wohl erst ne kleine Utility-Libary zusammenbasteln muss, um vernüftig mit den Bytes umgehn zu können..). =)
    Zwar hab ich absolut kein Problem damit, wenn andere die Maps verändern würden(Sowieso, wenns nach mir ginge, wäre alles open source..), aber man könnte vernünftig hin- und herspringen. So sind binäre Dateien und Textdateien auf der Festplatte anders abgespeichert? Das ändert meine frühere Weltansicht, alles bestehe aus Text-Dateien und nun kann ich einige Kompatibilitätsprobleme, die mir in der Vergangenheit aufgetreten sind, verstehen... mehr oder weniger...
    "das war meine letzte flamewar PM an dich ."

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von blubberblub ()

  • Nein, was das Speichern auf der Festplatte betrifft wird kein Unterschied zwischen Binär- und Textdateien gemacht. Lediglich beim Lesen und Schreiben sollte man aufpassen, wenn man im Textmodus arbeitet, da in diesem bestimmte Zeichen als Steuerzeichen arbeiten wie z.B. die Zeichen für den Zeilenumbruch. Zudem kann es vorkommen, dass beim Lesen und Schreiben manche binäre Zeichen ignoriert werden. Im Binärmodus ist man davon unabhängig. Man kann in diesem Modus ebenso Textdateien schreiben. Ist aber wie gesagt etwas umständlich jedes Zeichen einzeln zu schreiben und für Zeilenumbrüche musst du dir die entsprechenden Zeichen raussuchen, die das repräsentieren. Wobei das z.B. Windows und Linux unterschiedlich handhaben mit dem Umbruch. Deswegen würde ich auf sowas auch verzichten.
  • Benutzer online 1

    1 Besucher