Das Ende des FILE * -Zeigers entspricht nicht der Größe der geschriebenen Daten

8

Sehr einfach gesagt, ich habe den folgenden Code-Schnipsel:

%Vor%

und es gibt aus:

%Vor%

Warum ist das? Warum stimmt die Anzahl der geschriebenen Bytes nicht mit dem Dateizeiger überein?

    
paxdiablo 28.09.2008, 02:20
quelle

4 Antworten

19

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:

%Vor%

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 von wb 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 oder rb+ Öffnen der Binärdatei für das Update (Lesen und Schreiben)
w+b oder wb+ Abschneiden auf Null Länge oder Binärdatei für Update erstellen
a+b oder ab+ 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.

    
paxdiablo 28.09.2008, 02:23
quelle
0

Was bringt fwrite zurück? normalerweise sollte der Rückgabewert die Anzahl der geschriebenen Bytes sein. Was beantwortet die ftell () auch direkt vor dem fseek?

Es kann hilfreich sein zu wissen, welches Betriebssystem, C-Compiler-Version und C-Bibliothek.

    
DarenW 29.09.2008 04:26
quelle
0

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.

    
MSalters 29.09.2008 12:32
quelle
0

windows schreibt tatsächlich nicht alle Daten in die Datei ohne eine Flush und möglicherweise eine fsync. Vielleicht deshalb

    
rogerdpack 12.02.2010 23:55
quelle

Tags und Links