Domanda

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

uscita:

0
25755
25868

quello che sta succedendo? scrittura è impostato su 25755, e dico fwrite per scrivere che molti byte in un file, che è all'inizio, e poi im in una posizione oltre 25755?

È stato utile?

Soluzione

Se siete su un sistema DOSish (ad esempio, Windows) e il file non viene aperto in modalità binaria, line-finali saranno convertiti automaticamente ed ogni "linea" aggiungerà un byte.

Quindi, specificare "wb" come modalità piuttosto che solo come "w" @caf sottolinea. Esso non avrà alcun effetto su Unix come piattaforme e farà la cosa giusta per gli altri.

Ad esempio:

#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;
}

con 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

Con Cygwin gcc:

/cygdrive/c/Temp $ gcc y.c -o y.exe

/cygdrive/c/Temp $ ./y.exe
02

Altri suggerimenti

Si può dipendere dal modo in cui è stato aperto il file. Se si apre come un file di testo, quindi \n può essere scritta come \r\n nei sistemi DOS / Windows. Tuttavia, ftello64() probabilmente dà solo il puntatore del file binario, che conterebbe nei personaggi \r aggiuntivi scritti. Prova a svuotare la outbuf[] di tutti i dati \n o provare ad aprire il file come binario ("wb" invece di "w").

Il write variabile è inizializzata e quindi la dimensione della matrice e l'importo in lettere sarà essenzialmente casuale.

Interessante. Funziona bene su Windows VC ++, anche se ftello64 sostituiti con ftell.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top