Ende der Zeiger FILE * ist auf eine Größe von geschriebenen Daten nicht gleich
Frage
Sehr einfach gesagt, ich habe den folgenden Code-Schnipsel:
FILE* test = fopen("C:\\core.u", "w");
printf("Filepointer at: %d\n", ftell(test));
fwrite(data, size, 1, test);
printf("Written: %d bytes.\n", size);
fseek(test, 0, SEEK_END);
printf("Filepointer is now at %d.\n", ftell(test));
fclose(test);
und es gibt:
Filepointer at: 0
Written: 73105 bytes.
Filepointer is now at 74160.
Warum ist das so? Warum wird die Anzahl der geschriebenen Bytes nicht den Dateizeiger überein?
Lösung
Da Sie die Datei im Textmodus sind geöffnet wird, konvertiert es end-of-line-Marker, wie LF, in CR / LF.
Dies ist wahrscheinlich, wenn Sie unter Windows laufen lassen (und Sie wahrscheinlich sind, vorausgesetzt, dass Ihr Dateiname beginnt mit "c:\"
).
Wenn Sie die Datei in "wb"
Modus zu öffnen, ich vermute, dass Sie die Zahlen sind identisch finden:
FILE* test = fopen("C:\\core.u", "wb");
Der C99-Standard hat dies in 7.19.5.3 The fopen function
zu sagen:
Das Argument Modus zeigt auf einen String. Wenn die Zeichenfolge eines der folgenden ist, wird die Datei Öffnen im angezeigten Modus. Ansonsten ist das Verhalten nicht definiert.
r
offene Textdatei zum Lesen
w
auf Null-Länge gestutzt oder Textdatei zum Schreiben
a
append; öffnen oder Textdatei auf End-of-Datei
zum Schreibenrb
offene Binärdatei für
Lesenwb
auf Null Länge gestutzt oder Binär-Datei erstellen für das Schreiben
ab
append; öffnen oder Binär-Datei erstellen auf End-of-Datei
zum Schreibenr+
offene Textdatei für die Aktualisierung (Lesen und Schreiben)
w+
auf Null-Länge gestutzt oder Textdatei für Update
erstellena+
append; öffnen oder Textdatei für Updates, das Schreiben an End-of-Datei
erstellenr+b
oderrb+
offene Binärdatei für update (Lesen und Schreiben)
w+b
oderwb+
auf Null Länge gestutzt oder Binär-Datei erstellen für Update
a+b
oderab+
append; öffnen oder erstellen binäre Datei für die Aktualisierung, das Schreiben an End-of-Datei
Sie können sehen, dass sie zwischen w
und wb
unterscheiden. Ich glaube nicht, eine Implementierung ist erforderlich die zwei unterschiedlich zu behandeln, aber es ist in der Regel sicheren Binärmodus für binäre Daten zu verwenden.
Andere Tipps
Was bedeutet Fwrite zurückkehren? normalerweise sollte der Rückgabewert die Anzahl der geschriebenen Bytes sein. Auch, was tut die ftell () Antwort mit Recht vor der fseek?
Es könnte helfen, zu wissen, welches Betriebssystem, C-Compiler-Version und C-Bibliothek.
Ein Dateizeiger ist ein Cookie. Es hat keinen Wert. Das einzige, was Sie es für verwenden können, ist an der gleichen Stelle in einer Datei zu suchen. Ich bin nicht einmal sicher, ob ISO C garantiert, dass ftell Renditen Werte zu erhöhen. Wenn Sie das nicht glauben, schauen Sie bitte auf die verschiedenen seek () Modi. Sie existieren, gerade weil die Lage versetzt kein einfaches Byte ist.
Fenster schreiben nicht tatsächlich alle Daten in die Datei ohne einen Flush und möglicherweise einen fsync. Vielleicht ist das, warum