2017-01-16 25 views
-3

Ich möchte eine Struktur in einer Binärdatei überschreiben. Hier ist mein Code :fwrite append selbst der Dateipositionszeiger ist an der richtigen Stelle

struct my_st { 
    char value[10]; 
}; 

void replace(char value[10]){ 
FILE *fpointer; 
fpointer = fopen("data.dat", "rb+"); 
struct my_st x; 
struct my_st new; 
new.value="test"; 
while(1) { 
fread(&x,sizeof(x),1,fpointer); 
if(strcmp(x.value,value)==0) 
    break; 
} 
    fwrite(&new,sizeof(x),1,fpointer); 
} 

ich selbst überprüfen die Stelle der Dateipositionszeiger durch Drucken es Wert ist, bevor fwrite und es war richtig, aber es nur neue Daten am Ende der Datei anhängen und ersetzen nicht.

irgendwelche Vorschläge?

+1

Bitte geben Sie eine [MCVE]. Versuchen Sie, die Struktur zu ersetzen, die zuletzt gelesen wurde? – kaylum

+0

@ Kaylum ja ich bin. – Apoyr

+0

Nun, dann ist Ihr Code eindeutig falsch, weil der letzte 'fread' den Dateizeiger * nach * dieser Struktur in der Datei positioniert. – kaylum

Antwort

4

Wenn Sie eine Datei öffnen für update (+) und wenn Sie eine tun oder mehr Leseoperationen, müssen Sie eine Positionierung tun (zum Beispiel fseek()), bevor Sie schreibt tun. Wenn Sie eine oder mehrere Schreiboperationen ausführen, müssen Sie vor dem Lesen eine Positionierungsoperation ausführen (z. B. rewind()). Siehe zum Beispiel die POSIX-Spezifikation fopen().

Wenn eine Datei mit dem Update-Modus ('+' als zweite oder dritte Zeichen im Modus Argumente), sowohl Eingang und Ausgang kann durchgeführt werden, auf dem zugeordneten Strom geöffnet wird. Die Anwendung muss jedoch sicherstellen, dass der Ausgabe keine direkte Eingabe ohne einen dazwischen liegenden Aufruf an fflush() oder an eine Dateipositionierungsfunktion (fseek(), fsetpos() oder rewind()) folgt und die Eingabe nicht unmittelbar gefolgt von einer Ausgabe ohne dazwischen liegenden Aufruf einer Datei erfolgt Positionierungsfunktion, es sei denn, die Eingabeoperation trifft auf das Ende der Datei.

Sie führen keine Positionierungsoperationen zwischen Lese- und Schreibvorgängen aus. Das führt an und für sich zu undefiniertem Verhalten.

Angenommen, Ihre Implementierung weist 'undefiniertes Verhalten' auf, indem Sie sich nicht aus dem Weg gehen, nach Ihrer letzten fread(), schreiben Sie über den nächsten Eintrag - oder fügen Sie einen neuen Eintrag an, wenn der letzte gelesen wurde am Ende von die Datei.

  • Entscheiden Sie, wo die Daten geschrieben werden sollen.
  • Suchen Sie nach dem richtigen Speicherort (verwenden Sie fseek(fp, 0L, SEEK_CUR), wenn Sie den Lese-/Schreibzeiger nicht verschieben möchten).
  • Schreiben.
  • Wenn Sie als nächstes lesen, suchen Sie einen anderen - ein weiteres No-Op, wenn es nötig ist.
+0

arbeitete wie ein Charme! vielen Dank. :) – Apoyr

Verwandte Themen