einzelne Zeilen aus .txt löschen



  • Hi,

    wir haben folgendes Problem: wir haben eine Datenbank für Fußballspieler aufgebaut, in welcher man wahlweise, in eine *.txt, Spieler einfügen, anzeigen, hinzufügen oder auch löschen kann. Wir haben dies mit dem ifstream und ofstream Befehlen gehandhabt.
    Beim löschen haben wir allerdings ein Problem, da wir es bis jetzt nur geschafft haben, den kompletten Inhalt der *.txt zu löschen. Allerdings möchten wir eine einzelne Zeile, in der durch TAB getrennt jeweils Name, Vorname und Rückennummer aufgelistet sind löschen, um dadurch einen einzelnen Spieler aus der Datenbank herauszunehmen. Hat jemand ne Idee oder ein Beispiel, wie wir da weiter ran gehen können?

    THX schonmal.



  • Ich würde zu Programmbeginn die komplette Datei einlesen und in einem vector<spieler> unterbringen und am Ende die geänderte Datei komplett wieder zurückschreiben.
    (wenn du die Datei als ios::trunc öfnnest, wird der vorige Inhalt gelöscht)

    (ansonsten bietet das Dateisystem idR keine Möglichkeiten, einzelne Dateistückchen neu zusammenzubauen - da kannst du nur die Daten hinter der zu löschenden Zeile auslesen, zwischenspeichern und etwas weiter vorne wieder reinschreiben)



  • Aber man muss doch auch dem Programm eine Zeile nennen können, welche er dann auslöschen soll, oder? Das müsste doch irgendwie funktionieren! Denn Programmiertechnisch gesehen, ist es ja schlecht eine ganze Datei in den Puffer zu holen und dort zwischenzuspeichern, oder nicht?



  • Wenn es das Betriebssystem nicht unterstützt, geht das nicht 😉

    Und da Dateien physisch hintereinander auf Platte geschrieben werden, dürfte eine systemeigene "Zeile löschen"-Funktion genau so arbeiten: Datei zwischenspeichern, Ausschnitt löschen und neu schreiben. Eventuell wird das noch soweit optimiert, daß nur der Abschnitt hinter der Löschstelle umkopiert werden muß, aber sehr weit steigern lässt sich das nicht.

    Ansonsten solltest du Datei-Operationen auf ein Minimum beschränken. Und anstelle jede Operation (einfügen, löschen, ändern von Datensätzen etc) direkt an die Platte weiterzugeben, solltest du EINMAL alles einlesen (beim Programmstart bzw. beim Load-Befehl), dann auf deiner internen Datenstruktur arbeiten und schließlich EINMAL die Daten schreiben (beim Programmende bzw. beim Save-Befehl).



  • c++er schrieb:

    ...Das müsste doch irgendwie funktionieren! ...

    "Irgendwie" ist schonmal die Mutter des Mißerfolgs. ... und "müsste" die Hebamme. 😉

    c++er schrieb:

    ...Denn Programmiertechnisch gesehen, ist es ja schlecht eine ganze Datei in den Puffer zu holen und dort zwischenzuspeichern, oder nicht?

    Nicht unbedingt. Aber wenn Du knapp an Speicher sein solltest, kannst Du auch Zeilenweise (ein File) lesen und (ein anderes) schreiben. Dann brauchst Du Dir nur das Schreiben bei der passenden Zeile "zu verkneifen". Anschließend noch das Zielfile auf das Quellfile kopieren (mit BetriebssystemAPI) und fertig.

    Gruß,

    Simon2.


Log in to reply