Bestimmte Zeile in Binärfile löschen, Rest aufrücken



  • Hat sich erledigt, danke!



  • Die Standard C-Bibliothek bietet keine Funktionalität an, um eine Datei "abzuschneiden".
    Dein Code macht dies ja auch nicht, sondern liest und schreibt immer komplett die 100 Datensätze. Dies sollte aber statt mit "r" mit "rb" passieren, analog beim Schreiben.
    Das "Aufrücken" der Datensätze im Speicher kann leicht mit der Standardfunktion memmove geschehen, also in etwa:

    memmove(&gespraeche[loeschen-1],&gespraeche[loeschen],(100-loeschen)*sizeof*gespraeche); /* 0 indexbasiert */
    

    Initial sollten natürlich alle Datensätze 0-befüllt sein, der letzte Datensatz immer 0 bleiben und deine Suche nach leeren Datensätzen über die Tel.nr. auch für jeden Fall funktionieren (gültige Tel.nr. immer != 0).



  • Du redest selber von Binärdatei, dann musst du die Datei auch so öffnen. Mit "rb" statt "r", sonst erkennt fread() Steuerzeichen die nicht vorhanden sind.

    Zudem ist es nicht portabel eine struct direkt einzulesen.

    Und schau dir mal die Funktionen von time() aus der time.h an. Damit lässt sich auch leichter rechnen.

    Preise solltest du auch ganzzahlig in Cent berechnen. Vermeidet Rundungsfehler (bei Geld verstehen die meisten keinen Spaß 😉 )

    Zu deinem Problem:
    Pseudo-

    Schleife von i=loeschen bis i< MAX 
      gespraeche[i].anfangsstunde = gespraeche[i+1].anfangsstunde; 
      gespraeche[i].xxx           = gespraeche[i+1].xxx; 
      .....
    endschleife
    
    gespraeche[i].xxx           = 0; 
    ....
    

  • Mod

    Ich sehe nicht, wieso du da etwas an der Datei selbst ändern musst. Die Technik am Anfang alles einzulesen und am Ende (oder zur Sicherheit auch zwischendurch) alles zu speichern ist doch gut und bewährt. Wenn man nicht gerade eine riesige professionelle Datenbank schreiben will ist das eine tolle Methode.

    Und im Arbeitsspeicher kannst du die Telefonate ja recht einfach löschen und verschieben. Oder einfacher: Markiere sie irgendwie als gelöscht und am Ende werden die so markierten Einträge nicht mit in die Datei geschrieben.



  • Hat sich erledigt, danke!


Anmelden zum Antworten