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?

War es hilfreich?

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 Schreiben   rb offene Binärdatei für
Lesen   wb 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 Schreiben   r+ offene Textdatei für die Aktualisierung (Lesen und Schreiben)
  w+ auf Null-Länge gestutzt oder Textdatei für Update
erstellen   a+ append; öffnen oder Textdatei für Updates, das Schreiben an End-of-Datei
erstellen   r+b oder rb+ offene Binärdatei für update (Lesen und Schreiben)
  w+b oder wb+ auf Null Länge gestutzt oder Binär-Datei erstellen für Update
  a+b oder ab+ 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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top