Anuncios Google

Copiar un archivo

Buenas, quiero intentar sustituir un archivo por otro.

 

He intentado lo siguiente:

    FILE * cache = fopen("\\en_US\\champions\\akali.mp3","rb" );
                FILE * sonido = fopen("\\es_ES\\champions\\akali.mp3","wb");
 
    fread(&buffer,sizeof(buffer),10000,cache);
    fwrite(&buffer,sizeof(buffer),10000,sonido);
  fclose(cache);
    fclose(sonido);

 

El caso es que el archivo a sustituir, se me queda a 0 bytes... Alguna idea?


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

Copiar un archivo

Como dice antonio, puedes usar fseek para saber el tamaño del archivo antes de copiarlo. Además, asegurate que los archivos se abren correctamente:

if (cache == NULL || sonido == NULL){
  printf ("Error al abrir los archivos...");
  exit (-1);
}

También mira qué te devuelven las funciones fread/fwrite (en teoría te deberían devolver el número de elementos leidos/escritos). Más que nada para depurar.

Por último, como posible optimización de lo que propone antonioND, en lugar de leer todo el archivo de golpe en un buffer, hazlo poco a poco en un bucle con un buffer más chico, para ahorrar memoria. Sino, si el archivo ocupa 300MB, tu programa ocupará 300 MB en memoria (a lo mejor no tiene sentido que un archivo mp3 ocupe tanto, pero no es raro en un video/película).

Dinos qué te devuleven fopen/fread y fwrite para poder ayudarte mejor.

Saludos!

 


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de ateno_3

Yo siempre uso esta funcion a

Yo siempre uso esta funcion a la hora de copiar archivos

 

using namespace std;
    bool copy(string& c_origen, string& c_destino){ /* Si usas C, cambia string& por char, y  pon int en vez de bool*/
            FILE* origen=fopen(c_origen.c_str(), "rb"); /*Aqui solo pon el nombre de los char declarados en el nombre de la funcion*/
            FILE* destino=fopen(c_destino.c_str(), "wb");
            if(!origen || !destino) return false; /* o return 0*/
 
           long longitud, cantidad;
 
           fseek(origen, 0, SEEK_END); /*Me coloco al final del fichero*/
           longitud=ftell(origen); /*Cuento cuantos bytes desde el principio hasta donde me coloque : tamano del fichero*/
           rewind(origen); /* Me vuelvo a colocar al principio del fichero*/
 
           char* buffer=new char[longitud+1]; /* o char* buffer=(char*) malloc(longitud+1); */
 
           cantidad=fread(buffer, 1, longitud, origen) /* Leo de origen, los bytes indicados en longitud, con un tamano de 1 byte cada uno y lo almaceno en buffer*/
          fwrite(buffer, 1, cantidad, destino); /* Escribo la cantidad de buffer indicada la variable cantidad, en el archivo 'destino' */
          /* Liberamos recursos*/
         delete[] buffer /* o free(buffer); */
         fclose(origen);
         fclose(destino);
}


Programo en C, C++, C# y ASM ( Sintaxis INTEL y AT&T )

Proyectos:

- UnlockMii 5.0 ----> UnlockMii 5.1: ( EN CONSTRUCCION -> 2% )

- MiiOS ( EN CONSTRUCCION -> 0,01% )

El mejor antivirus ==> Avast!

Con esto sabes el tamaño del

Con esto sabes el tamaño del archivo:

fseek(file, 0, SEEK_END);
unsigned int size = ftell(file);
rewind(file);

Haces buffer = malloc(size); y copias todo ahí. Si tienes algún problema, pregunta, pero vamos, no tiene mucho misterio.

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.