Binärdateien, bestimmten Eintrag löschen



  • Hallo,

    ich bearbeite gerade (in C) ein kleines Programm das divese struct Einträge binär speichert, ausgibt, damit arbeitet usw. funktioniert auch alles soweit super. Aber nun möchte ich dem Benutzer die Möglichkeit geben einzelne Datensätze zu löschen unter Angabe einer Positionsnummer (zum Beispiel Eintrag 8).

    Wie kriege ich diesen einen Eintrag am besten aus einer Binär-Datei gelöscht, egal ob sich der Eintrag nun irgendwo "mitten-drin" oder am Ende der Datei befindet.

    Zuerst dachte ich ja daran alle einträge die unter dem zu löschenden liegen einfach um "eins raufzurutschen" aber dann wirft sich die Frage auf was passiert mit dem letzten Datensatz.

    Vielleicht hat ja jemand ein solches Problem schonmal gelöst und kann mir helfen?

    Ciao



  • Die schnellste Lösung besteht wohl darin, den betroffenen Eintrag als "gelöscht" zu markieren und die Datei in regelmäßigen Abständen zu defragmentieren (alle nicht gelöschten Datensätze umkopieren, alte Datei löschen, neue Datei umbenennen).

    Ansonsten: Wenn du viel am Stück mit der selben Datei arbeitest, kannst du die komplette Liste einmal am Programmanfang einlesen in einen vector<>, deque<> oder list<>, dann im Speicher mit den Daten arbeiten und sie schließlich wieder zurückschreiben, bevor du das Programm beendest.



  • Hallo,

    danke für die rasche Antwort. Ich werde es dann so machen und tatsächlich die Datei einfach umkopieren. Da nur sehr wenige Lösch Vorgänge stattfinden scheint mir dies die vernünftigste Lösung.

    Dachte nur es gibt eventuell eine Spezialfunktion bei der man Angibt "lösche ab Offset XY, Z Bytes" o.ä.

    Ciao



  • Wie kann man überhaupt binär in eine Datei
    schreiben? Also, mit welchen Funktionen.
    Und müssen die zu schreibenden Werte auch schon
    vor dem Schreib-Vorgang binär sein?
    Wenn ja, wie kann man z.B. aus 'short x = 256;'
    eine binäre Zahl machen?
    Danke im Voraus!

    Achja, ich programmiere in C



  • Unter C++ mit ofstream::write(), unter C mit fwrite() (dazu ist es vorteilhaft, die Datei im Modus "ios::out|ios::binary" bzw. "wb" zu öffnen).


Anmelden zum Antworten