Stream überschreiben
-
Hallo Zusammen,
ich habe eine File Stream handle, mit der ich eine Datei überschreiben möchte.
Ich möchte den stream so lange offen halten, wie das Program(GUI) läuft. Und
wenn Benutzer seine Konfiguration ändert und einen bestimmten Knopf drückt,
sollen die alte Daten mit Neuen überschrieben werden.Ich habe mir eine Strategie überlegt, wo ich mit dem File Pointer auf den
Anfang der Datei komme und die alten Daten mit der Neuen überschreibe. Wenn
alte Daten länger als neue sind, wird die Rest mit "backspace" zeichen
überschrieben.void write_to_open_stream(char* buffer, FILE* h){ size_t buf_len; /* input buffer length */ fpos_t eof_pos; /* position of eof */ long long remain = 0 ; char bspace = '\b'; /* go to the eof */ fseek(h, OL, SEEK_END); /* get position of pointer at stream */ if( fgetpos(h, &eof_pos) == -1 ) return ; /* go to the beginning of file */ rewind(h); /* simply print the new buffer */ fprintf(h, "%s", buffer); if( (remain = ((long long) buf_len -(long long) eof_pos.__pos) ) < 0 ){ remain =*-1; /* we need positive val of remain */ while( remain-- >= 0) fprintf(h, "%c", bspace); } }
Nun haut dieser Weg nicht hin! Ich kriege manchmal "Müllzeichen" am Ende
geprintet. Ausserdem wird die Datei immer grösser(byte size). Ich habe einen
workaround mit freopen gefunden, aber wundere warum so eine Methode(oben) nicht
funktionieren würde.Danke,
-
Ok, mein Fehler. Jetzt wo ich alles wieder sorgfältig angeschaut habe: Bevor ich die Dateiende "seek"e, müsste ich erst rewind(FILE
machen, so dass die position der Dateiende relativ zu Beginn ermittelt werden kann. Sowie es oben steht, finde ich nur den Position relativ zu dem Zeiger, der irgendein Zeichen zwischen Anfang und Ende zeigt..
Also:
/* how come you think you are at the beginning, so do a: */ rewind(h); /* go to the eof */ fseek(h, OL, SEEK_END); /* get position of pointer at stream */ if( fgetpos(h, &eof_pos) == -1 ) return ; /* go to the beginning of file to overwrite */ rewind(h); ...
Hab's ausprobiert, alles prima.
Gruss,
-
Warum nicht einfach mit fclose die Datei schließen und sofort wieder mit w+ öffnen? Das überschreibt die Daten und du hast keine sinnlosen \b in der Datei.