Da Sie die Datei im Textmodus öffnen, werden Endzeilenmarkierungen wie LF in CR / LF konvertiert.
Dies ist wahrscheinlich, wenn Sie unter Windows laufen (und Sie sind wahrscheinlich, da Ihr Dateiname mit "c:\"
beginnt).
Wenn Sie die Datei im "wb"
-Modus öffnen, vermute ich, dass die Zahlen identisch sind:
Der C99-Standard sagt das in 7.19.5.3 The fopen function
:
Der Argumentmodus zeigt auf eine Zeichenfolge. Wenn die Zeichenfolge eine der folgenden ist, lautet die Datei im angezeigten Modus öffnen. Andernfalls ist das Verhalten nicht definiert.
r
Textdatei zum Lesen öffnen
w
auf Länge null abschneiden oder Textdatei zum Schreiben erstellen
a
append; Öffnen oder Erstellen einer Textdatei zum Schreiben am Ende der Datei
rb
Öffnen der Binärdatei zum Lesen vonwb
Abschneiden auf Null Länge oder Erstellen einer Binärdatei zum Schreiben
ab
append; Öffnen oder Erstellen einer Binärdatei zum Schreiben am Ende der Datei
r+
Öffnen der Textdatei zum Aktualisieren (Lesen und Schreiben)
w+
Abschneiden auf Null Länge oder Erstellen einer Textdatei zum Aktualisieren
a+
anhängen; Öffnen oder Erstellen einer Textdatei für das Update, Schreiben am Ende der Datei
r+b
oderrb+
Öffnen der Binärdatei für das Update (Lesen und Schreiben)
w+b
oderwb+
Abschneiden auf Null Länge oder Binärdatei für Update erstellen
a+b
oderab+
append; Öffnen oder erstellen Sie eine Binärdatei für das Update, schreiben Sie am Ende der Datei
Sie können sehen, dass sie zwischen w
und wb
unterscheiden. Ich glaube nicht, dass eine Implementierung erforderlich ist , um die beiden unterschiedlich zu behandeln, aber es ist normalerweise sicherer Binärmodus für binäre Daten zu verwenden.
Ein Dateizeiger ist ein Cookie. Es hat keinen Wert. Das einzige, wofür Sie es verwenden können, ist den gleichen Ort in einer Datei zu suchen. Ich bin nicht einmal sicher, ob ISO C garantiert, dass ftell steigende Werte zurückgibt. Wenn Sie das nicht glauben, sehen Sie sich bitte die verschiedenen seek () -Modi an. Sie existieren genau, weil die Position kein einfacher Byte-Offset ist.
windows schreibt tatsächlich nicht alle Daten in die Datei ohne eine Flush und möglicherweise eine fsync. Vielleicht deshalb