Anuncios Google

Función copia perfectamente archivos de texto, pero no archivos binarios :S

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...


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de joserc87

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).


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de dj51_Shura

Ahhh...

muchas gracias por la explicación, muy completa. Me pongo a ello

Gracias a los dos por la ayuda ;-)

Imagen de MiniAreas

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

 

		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

 

Espero haberte ayudado


Si te cansas de renombrar tus animes a mano, echa un vistazo a Sodkast

Imagen de dj51_Shura

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...

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.