Cómo crear una copia exacta del archivo en c

Quiero crear una copia exacta de un archivo (.bmp) en c

#include int main() { FILE *str,*cptr; if((str=fopen("org.bmp","rb"))==NULL) { fprintf(stderr,"Cannot read file\n"); //return 1; } if((cptr=fopen("copy.bmp","wb"))==NULL) { fprintf(stderr,"Cannot open output file\n"); //return 1; } fseek(str, 0, SEEK_END); long size=ftell(str); printf("Size of FILE : %.2f MB \n",(float)size/1024/1024); char b[2]; for(int i=0;i<size;i++) { fread(b,1,1,str); fwrite(b,1,1,cptr); } fseek(cptr, 0, SEEK_END); long csize=ftell(str); printf("Size of created FILE : %.2f MB \n",(float)csize/1024/1024); fclose(str); fclose(cptr); return 0; } 

Aunque crea un archivo del mismo tamaño, pero Windows arroja un error al intentar ver la copia recién creada del bitmap. ¿Por qué está pasando esto?

Ha movido el puntero del archivo para el archivo de entrada al final del archivo antes de comenzar a leerlo. Necesitas restaurarlo al principio.

Cambio:

 fseek(str, 0, SEEK_END); long size=ftell(str); 

a:

 fseek(str, 0, SEEK_BEGIN); long size=ftell(str); fseek(str, 0, SEEK_SET); 

Tenga en cuenta que su código carece de comprobación de errores: si al menos verificó el resultado de fread , su error habría sido inmediatamente evidente. Mensaje para llevar a casa: no corte las esquinas cuando se trata de la comprobación de errores: pagará dividendos más adelante.

Debe volver al inicio del archivo original porque está leyendo continuamente en el EOF y, por lo tanto, no está haciendo una copia del contenido del archivo, solo lo que sea que esté en su matriz b [].

No está verificando los códigos de retorno de fread () y fwrite (). Si hubiera estado haciendo eso, podría haber resuelto este problema a partir de los códigos de retorno.

Si verifica el tamaño del archivo original y la copia en bytes, debería indicarle el problema.

Este código lee un byte y escribe un byte.

 #include #include  #include  #include  #define KB 1024 int main() { unsigned int ifd,ofd,rcnt; char buf[KB]; ifd=open("orig.jpg",O_RDONLY); if(ifd==0) { fprintf(stderr,"Cannot read file\n"); //return 1; } ofd=open("copy.jpg",O_WRONLY|O_CREAT); if(ofd==0) { fprintf(stderr,"Cannot open output file\n"); //return 1; } while(rcnt=read(ifd,buf,KB)) write(ofd,buf,rcnt); } 

~

Esta es una buena función para copiar archivos! Copiar char por char es mejor que leer todo el archivo porque ese resultado (si el archivo es demasiado largo) es un bufferoverflow!

 double copy(char *input, char *output) { FILE *f_in = fopen(input, "r"); FILE *f_out = fopen(output, "a"); if (!f_in || !f_out) { fclose(f_in); fclose(f_out); return -1; } int c; while ((c = fgetc(f_in)) != EOF) fputc(c, f_out); fclose(f_in); fseek(f_out, 0, SEEK_END); long size = ftell(f_out); fclose(f_out); return (double)(size / 1024 / 1024); // MB } 

Esta función devuelve los MB del archivo de salida. Si no fue exitoso devuelve 0 .

Utilice esta función de esta manera:

 double output; if ((output = copy("What ever you want to copy", "Where ever it should be printed")) != -1) printf("Size of file: %lf MB.\n", output); 

Espero que esto ayude 🙂

Copié su primer código y también usé la primera solución, solo necesita agregar este código a su progtwig: fseek (str, 0, SEEK_SET), y listo se producirá su copia de bitmap.