copiare il contenuto di un file binario
-
02-10-2019 - |
Domanda
Io sono la progettazione di un decodificatore di immagini e come primo passo ho cercato di copiare il tramite c. cioè aprire il file, e scrivere il suo contenuto in un nuovo file. Di seguito è riportato il codice che ho usato.
while((c=getc(fp))!=EOF)
fprintf(fp1,"%c",c);
dove fp è il file di origine e FP1 è il file di destinazione. Le esegue programma senza alcun errore, ma il file immagine ( "bmp") non è correttamente copiato. Ho osservato che la dimensione del file copiato è meno e solo il 20% dell'immagine è visibile, tutto il resto è nero. Quando ho provato con semplici file di testo, la copia era completa.
Sai qual è il problema?
Soluzione
Assicurarsi che il tipo di c
variabile è int
, non char
. In altre parole, inviare più codice.
Questo perché il valore della costante EOF
è tipicamente -1, e se leggete i caratteri come valori char
dimensioni, ogni byte che è 0xff
sarà come la costante EOF. Con i bit supplementari di un int
; c'è spazio per separare i due.
Altri suggerimenti
Hai aperto i file in modalità binaria? Cosa stai passando a fopen
?
E 'uno dei più "popolare" C grattacapi .
Si dovrebbe usare fread
fwrite
and utilizzando un blocco alla volta ??p>
FILE *fd1 = fopen("source.bmp", "r");
FILE *fd2 = fopen("destination.bmp", "w");
if(!fd1 || !fd2)
// handle open error
size_t l1;
unsigned char buffer[8192];
//Data to be read
while((l1 = fread(buffer, 1, sizeof buffer, fd1)) > 0) {
size_t l2 = fwrite(buffer, 1, l1, fd2);
if(l2 < l1) {
if(ferror(fd2))
// handle error
else
// Handle media full
}
}
fclose(fd1);
fclose(fd2);
E 'sostanzialmente più veloce da leggere in blocchi più grandi, ed i dati fread / maniglia fwrite solo binari, quindi nessun problema con \ n, che potrebbero essere trasformati a \ r \ n in uscita (su Windows e DOS) o \ r (su (vecchi) MAC)