binärdatei effektiv lesen?



  • Hallo,

    ich bin ein Anfänger und daher erwartet bitte nicht allzu viel. Ich möchte eine Binärdatei auslesen und weiß schon grob, wie eine Binärdatei aufgebaut ist. Als ersteres ermittle ich die sogenannte Magic-Number. Damit kann ich feststellen, wann auch der nächste Datensatz beginnt, da ja jeder Datensatz mit dieser Nummer beginnt.

    Wie springe ich jetzt möglichst effektiv z.B. zum 4.Datensatz.
    Ich kenn zwar den Befehl "fseek", aber da muß ich die Bytelänge angeben. Jedoch weiß ich nicht die Länge bzw. kann die doch von Datensatz zu Datensatz variieren oder?

    Kann mir bitte jmd einen Ansatz nennen, wie ich am vernünftigsten das Problem löse? Danke!!



  • Dateien sind zuerst einmal nur eine Array von Bytes - wenn die ganze Sache eine Struktur haben soll, dann muss man ein Dateiformat festlegen bzw. es aus Metadaten(z.B. Dateinamen) ermitteln.
    Von daher, um was für eine Dateityp geht es? Binärdatei hieße für mich einfach nur ein Array von Bytes ohne jede Struktur.



  • Wie springe ich jetzt möglichst effektiv z.B. zum 4.Datensatz.

    Indem du zum ersten springst, schaust wie lang er ist, dann zum naechsten, schaust wie lang der ist, ... bis zum 4ten eben.



  • Wenn die Länge der einzelnen Datensätze unbekannt ist, musst du jede(s) Zeichen(block) auf die Magic-Number überürfen.

    Beispiel:
    Wenn du eine reine Textdatei hast, wäre die Magic-Number das '\n'
    Damit endet jede Zeile.
    Da nirgends die Zeilenlänge angegeben ist, musst du alle vorhergehende Zeilen (jedes Zeichen) einlesen um zu einer bestimmten Zeile zu gelangen.



  • dummy2k schrieb:

    Wie springe ich jetzt möglichst effektiv z.B. zum 4.Datensatz.
    Ich kenn zwar den Befehl "fseek", aber da muß ich die Bytelänge angeben. Jedoch weiß ich nicht die Länge bzw. kann die doch von Datensatz zu Datensatz variieren oder?

    Damit hast Du schon den richtigen Befehl.

    Allerdings ist es viel wichtiger, sich erst einmal klar darüber zu werden, was man will und worauf es einem ankommt:
    Kleine Dateigröße? Schneller Zugriff? Wenig Hauptspeicher? Hoher Durchsatz? Sequentielles Lesen? Sortierung? ....

    Wenn es um Performance in der Praxis geht, muss man im Hinterkopf haben, wie die Dateien auf dem Massenspeicher liegen. Klassischerweise auf einer Festplatte, in der die Datei in Clustern angelegt ist. Dass heißt, dass die Bibliotheksfunktion wahrscheinlich ohnehin gleich 4k auf einmal lies.
    Für schnellen Zugriff wird dann mit fester Record-Größe gearbeitet, die sinnvollerweise ein Teiler oder ein Vielfaches der Clustergröße ist.

    Wenn es sich jetzt nur um ein paar Kilobyte auf einem PC handelt, braucht man sich allerdings bei den heutigen Geschwindigkeiten meist keine Gedanken über sowas machen.

    Für eine "richtige" Datenverwaltung kann man dann auch gleich eine Datenbank einsetzen und macht sich um das gar keine Gedanken mehr.

    Ciao, Allesquatsch



  • Die Länge kann, muß aber nicht variieren. In der Großrechnerwelt gibt es dafür den DCB mit RECFM=V oder RECFM=F. Wenn die Daten vom Vorgänger aus einer
    struct geschrieben werden, sollte die Satzlänge eigentlich konstant sein.
    Klappt zumindest genau wie erwartet bei meinen eigenen Programmen.



  • dummy2k schrieb:

    Ich möchte eine Binärdatei auslesen und weiß schon grob, wie eine Binärdatei aufgebaut ist.

    Alle Dateien sind Binärdateien...

    dummy2k schrieb:

    Als ersteres ermittle ich die sogenannte Magic-Number. Damit kann ich feststellen, wann auch der nächste Datensatz beginnt, da ja jeder Datensatz mit dieser Nummer beginnt.

    Das würde bedeuten, der 4. Satz beginnt nach der 4. Magik Number, sofern diese nicht auch Bestandteil der Daten zwischen zwei Magik Numbern ist.

    dummy2k schrieb:

    Wie springe ich jetzt möglichst effektiv z.B. zum 4.Datensatz.
    Ich kenn zwar den Befehl "fseek", aber da muß ich die Bytelänge angeben. Jedoch weiß ich nicht die Länge bzw. kann die doch von Datensatz zu Datensatz variieren oder?

    Wenn die Satzlänge nicht konstant ist, wirst Du die Datei einlesen und interpretieren müssen (nach Magik Numbern suchen).

    Ciao MM



  • Hallo,

    vielen Dank für eure Antworten und auch Hinweise bzgl. Backgroundwissen!. Das Format, dass ich auslesen möchte ist XTC. Ich hätte bitte noch eine Frage bzgl. der Satzlänge.
    Ich habe jetzt ein kleineres Binärfile ausgelesen, ohne nach der MagicNumber zu suchen. Ich konnte problemlos jeden einzeln Datensatz auslesen. Ich nehme somit an, dass es durch das XTC-Format die Datensatzlänge definiert ist.

    Meine Frage:
    Was passiert eigentlich, wenn ein Datensatz über die definierte Länge geht? In meinem Programm(Matlab) springe ich von einem Datensatz zum nächsten mit dem Befehl: "fseek(fid, 500*recordNr, 'bof');" (in C ist der Befehl praktisch ident, also fid ist Pointer, bof entspricht SEEK_SET)

    500 gibt ja die Bytelänge an. Kann es nicht sein, dass der Datensatz länger als 500 ist oder ist das im vorhinein nicht möglich, da es dann keine gültige XTC-Datei mehr wäre, sprich korrupte Datei? Danke!



  • dummy2k schrieb:

    500 gibt ja die Bytelänge an. Kann es nicht sein, dass der Datensatz länger als 500 ist oder ist das im vorhinein nicht möglich, da es dann keine gültige XTC-Datei mehr wäre, sprich korrupte Datei? Danke!

    XTC kenne ich nicht, aber wenn man eine feste Satzlänge hat, dann darf und kann kein Satz länger sein. Das liegt an der Natur einer festen Satzlänge.

    Ciao
    MM



  • Allesquatsch schrieb:

    Damit hast Du schon den richtigen Befehl.

    man munkelt, in fachkreisen hieße es funktion ...


Log in to reply