Warum schreibt FWrite mehr als ich es erzähle?
Frage
FILE *out=fopen64("text.txt","w+");
unsigned int write;
char *outbuf=new char[write];
//fill outbuf
printf("%i\n",ftello64(out));
fwrite(outbuf,sizeof(char),write,out);
printf("%i\n",write);
printf("%i\n",ftello64(out));
Ausgang:
0
25755
25868
Was ist los? Schreiben ist auf 25755 gesetzt, und ich sage FWrite, dass er so viele Bytes in eine Datei schreiben soll, die am Anfang ist, und dann an einer Position außer 25755?
Lösung
Wenn Sie sich in einem dosischen System (z. B. Windows) befinden und die Datei im Binärmodus nicht geöffnet wird, werden die Linienendings automatisch konvertiert und jede "Zeile" wird ein Byte hinzugefügt.
Also, geben Sie an "wb"
eher als Modus als nur "w"
Wie @CAF betont. Es wird keinen Einfluss auf Unix -ähnliche Plattformen haben und das Richtige für andere tun.
Zum Beispiel:
#include <stdio.h>
#define LF 0x0a
int main(void) {
char x[] = { LF, LF };
FILE *out = fopen("test", "w");
printf("%d", ftell(out));
fwrite(x, 1, sizeof(x), out);
printf("%d", ftell(out));
fclose(out);
return 0;
}
Mit VC ++:
C:\Temp> cl y.c Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. y.c Microsoft (R) Incremental Linker Version 9.00.21022.08 Copyright (C) Microsoft Corporation. All rights reserved. /out:y.exe C:\Temp> y.exe 04
Mit Cygwin GCC:
/cygdrive/c/Temp $ gcc y.c -o y.exe /cygdrive/c/Temp $ ./y.exe 02
Andere Tipps
Es kann von dem Modus abhängen, in dem Sie die Datei geöffnet haben. Wenn Sie es als Textdatei öffnen, dann \n
kann geschrieben werden als \r\n
In DOS/Windows -Systemen. Jedoch, ftello64()
Wahrscheinlich gibt der Binärdateizeiger nur, was in der Extra zählen würde \r
Charaktere geschrieben. Versuchen Sie, das zu räumen outbuf[]
von jedem \n
Daten oder versuchen Sie, die Out -Datei als binär zu öffnen (Binär ("wb"
Anstatt von "w"
).
Die Variable write
ist nicht initialisiert und so ist die Größe des Arrays und die geschriebene Menge im Wesentlichen zufällig.
Interessant. Funktioniert gut unter Windows VC ++, wenn auch ftello64
Ersetzt mit ftell
.