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?

È stato utile?

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 fwriteand utilizzando un blocco alla volta

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)

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