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?

War es hilfreich?

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.

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