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.


Anmelden zum Antworten