Dateiinhalt löschen
-
ich habe folgendes problem. ich schreibe eine strucktur in eine binärdatei. auslesen und ändern funktioniert problemlos. was mir zu schaffen macht ist wenn ich einen datensatz löschen möchte.
z.b.
1. Datensatz: Hugo Mayer 23Jahre
2. Datensatz: Fritz Myaer 5Jahre
3. Datensatz: Hildegard 99Jahreund nun möchte ich den 2. Datensatz aus meinem file löschen
vielen danke für jede hilfe
-
Hallo,
das wurde alles schon öfter mal gepostet. Einfach rauslöschen ist nicht so einfach weil du dann die folgenden Datensätze um eine Postion zurück schreiben müsstest. Du kannst aber eine neue Datei öffnen alle Datensätze bis auf den den du löschen willst eintragen und die alte Datei löschen.
-
vielen dank. hab mir fast sowas schon gedacht als ich die suchfunktion des forums benutzt habe.
nurn stellt sich die frage wie ich am einfachsten einen "klon" ohne den betreffenden datensatz erstelle?????
hab mir schon überlegt mit tmpfile eine temporäre datei zu erstellen und diese dann am ende des übertrags umzubenennen. nur das "rüberkopieren" da hängts grad bei mir
-
Das sollte nicht so schwer sein.
struct Datensatz ds; FILE *alt,*neu; char *tmname; if((alt==fopen("ALTPFAD","rb"))==NULL) return; tmpname=tmpnam(NULL); if((neu==fopen(tmpname,"wb"))==NULL) return; while(!feof(alt)){ fread(&ds,sizeof(Datensatz),1,alt); if(!ds.geloescht) fwrite(&ds,sizeof(Datensatz),1,neu); } fclose(alt); fclose(neu); remove("ALTNAME"); rename(tmpnam,"ALTNAME");
-
vielen dank, ich glaub es haben noch zwei fopen für die alte und neue datei gefehelt, ohne die beiden gings nicht. nochmals vielen dank für die schnelle hilfe
-
den letzten datensatz schreibt er komischerweise immer doppelt in die neue datei *grübel*
-
Normalerweise würde ich folgendermaßen vorgehen:
- Beim Programmstart komplette Datei in den Arbeitsspeicher einlesen (dynamisches Array der Struktur)
- Mit den Daten im Arbeitsspeicher während des Programmablaufs arbeiten (anzeigen, neu anlegen, ändern, löschen, ...)
- Bei Programmende die Daten, die im Arbeitsspeicher wieder in die Datei schreibenVorraussetzung ist natürlich, dass nicht zuviele Daten in der Datei stehen
-
Martinle schrieb:
den letzten datensatz schreibt er komischerweise immer doppelt in die neue datei *grübel*
Ja das liegt daran das feof() erst wahr zurück gibt wenn versucht wurde einen Datensatz einzulesen der nicht da ist weil das Ende der Datei erreicht ist. Also nachdem der letzte Datensatz gelesene wurde.
Die Daten vom vorherigen Lesen befinden sich noch in der Strukt und werden so doppelt reingeschrieben. Wenn du den Code folgendermaßen änderst gehts.while(true){ fread(&ds,sizeof(Datensatz),1,alt); if(feof(alt)) break; if(!ds.geloescht) fwrite(&ds,sizeof(Datensatz),1,neu); }
Wenn es vertretbar ist würde ich dir auch zur Methode die AJ vorgeschlagen hat raten, das wird einfacher. Wie schon gesagt vorrausgesetzt die Datei ist nicht zu riesig.
-
vielen dank euch allen, ihr seit spitze. hab viel gelernt