16 Stimmen

Warum schreibt fwrite mehr, als ich ihm sage?

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));

Ausgabe:

0
25755
25868

Was ist hier los? write ist auf 25755 eingestellt, und ich sage fwrite, dass es so viele Bytes in eine Datei schreiben soll, die am Anfang steht, und dann bin ich an einer anderen Position als 25755?

29voto

Sinan Ünür Punkte 114993

Wenn Sie mit einem DOS-System (z. B. Windows) arbeiten und die Datei nicht im Binärmodus geöffnet ist, werden Zeilenenden automatisch umgewandelt und jeder "Zeile" wird ein Byte hinzugefügt.

Also, spezifizieren Sie "wb" als Modus und nicht nur "w" wie @caf hervorhebt. Es wird keine Auswirkungen auf Unix-ähnliche Plattformen haben und wird auf anderen Plattformen das Richtige 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

4voto

Paul Hsieh Punkte 1456

Dies kann von dem Modus abhängen, in dem Sie die Datei geöffnet haben. Wenn Sie die Datei als Textdatei öffnen, dann \n kann geschrieben werden als \r\n in DOS/Windows-Systemen. Allerdings, ftello64() gibt wahrscheinlich nur den binären Dateizeiger an, der zu den zusätzlichen \r Zeichen geschrieben. Versuchen Sie das Löschen der outbuf[] eines beliebigen \n Daten oder versuchen Sie, die Ausgangsdatei als Binärdatei zu öffnen ( "wb" anstelle von "w" ).

2voto

Graeme Perrow Punkte 53901

Die Variable write ist nicht initialisiert, so dass die Größe des Arrays und die Menge, die geschrieben wird, im Wesentlichen zufällig sind.

0voto

John Lockwood Punkte 3655

Interessant. Funktioniert gut unter Windows VC++, wenn auch ftello64 ersetzt durch ftell .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X