Bueno, usé las funciones fopen, fgets... etc... y copia como debe ser archivos de texto. Sin embargo, a la hora de copiar un archivo binario (y eso que especifico el modo binario en fopen) copia una parte del archivo, nunca el archivo entero.
Anteriormente había pensado hacerlo con fread y fwrite, pero me daban problemas, así que... como fgets me iba bien, pues...
Este es el código:
int ioCopyFile(const char * source, const char * dest, const char * mode) { FILE *finput = fopen(source, "rb"); // Open the source file in read mode if(finput == NULL) // error at opening input descriptor return 0; FILE *foutput; if(mode == OVW) { foutput = fopen(dest, "wb"); // Open the output file in write/binary mode } else if(mode == APP) { foutput = fopen(dest, "ab"); // Open the output file in append/binary mode } else if((mode == SAFETY) && (ioFileExists(dest) == true)) { return 0; } else { fclose(finput); return 0; } if(foutput == NULL) { // error at opening output descriptor fclose(finput); return 0; } char buffer[2048]; // Define a buffer to put the readed data from *finput* file descriptor while(fgets(buffer, 2048, finput) != NULL) { fputs(buffer, foutput); } fclose(finput); fclose(foutput); return 1; }
Lo de los 'OVW', 'APP' y 'SAFETY' son modos definidos antes, en el mismo archivo de cabecera que me estoy haciendo para manejo de archivos.
Muchas gracias por todo
http://www.mhypnok.blogspot.com/
Gracias a Dark_AleX, Total_Noob, VirtuousFlame, Coldbird, Codestation...
fputs
No se trata de como abras el archivo, sino de qué funcion utilices para escribir/leer:
fputs escribe el contenido del string hasta llegar al caracter '/0'. Como es un archivo binario, este caracter puede formar parte del archivo. Pongamos la siguiente situación: el fichero contiene, entre otros, variso caracteres /0. fgets lee 2048 caracteres, algunos de los cuales son /0 y se los pasa a fputs. Fputs comienza a escribir hasta que encuentra el primer /0, por lo que no escribe los 2048!!. Además, si el archivo binario tiene otros caracteres raros como EOF pararía de leer.
En resumen, utiliza read y write que son mucho más apropiados para esto (o fread y fwrite).
Dennis Ritchie. Padre de C y cocreador de UNIX.
R.I.P.
Ahhh...
muchas gracias por la explicación, muy completa. Me pongo a ello
Gracias a los dos por la ayuda ;-)
Te falta guardarlo como binario
Como bien has dicho lo abres como binario y todo, pero a la hora de escribir el archivo te falta guardar los datos en binario, en otras palabras, lo lees en binario pero lo escribes en texto
Espero haberte ayudado
Si te cansas de renombrar tus animes a mano, echa un vistazo a Sodkast
Perdón
ya lo tenía, pero como estaba ya desesperao (xD) pues lo quité para probar y se me olvidó ponerlo de nuevo.
Sigue lo mismo. El archivo que estoy intentando copiar no tiene nada de texto, es un PRX de la PSP (xD) pero... ¿copia la mitad? No sé por qué. ¡Ah! y otro detalle. A menor tamaño del búfer, mayor porción del archivo copia. ¡pero esto es ridículo!
Si alguien me lo pudiera explicar...
Como ya dije, prefiero esto a fread y fwrite, pero vamos, me paso sin ningún problema.
Muchas gracias por la respuesta.
http://www.mhypnok.blogspot.com/
Gracias a Dark_AleX, Total_Noob, VirtuousFlame, Coldbird, Codestation...