Perché fwrite a scrivere più di quanto io dico a?
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?
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
.