Este sitio web usa cookies de terceros para analizar el tráfico y personalizar los anuncios. Si no está de acuerdo, abandone el sitio y no siga navegando por él. ×


9.13. Un ejemplo: copiador de ficheros en una pasada

Como ejemplo de un fuente en el que se apliquen algunas de las ideas más importantes que hemos visto, vamos a crear un copidor de ficheros, que intente copiar todo el fichero de origen en una única pasada: calculará su tamaño, intentará reservar la memoria suficiente para almacenar todo el fichero a la vez, y si esa memoria está disponible, leerá el fichero completo y lo guardará con un nuevo nombre.

/*---------------------------*/
/*  Ejemplo en C nº 84:      */
/*  C084.C                   */
/*                           */
/*  Copiador de ficheros en  */
/*  una pasada               */
/*                           */
/*  Curso de C,              */
/*    Nacho Cabanes          */
/*---------------------------*/

#include 
  
FILE *fichOrg, *fichDest;      /* Los dos ficheros */
char *buffer;                  /* El buffer para guardar lo que leo */
char nombreOrg[80],            /* Los nombres de los ficheros */
  nombreDest[80];
long longitud;                 /* Tamaño del fichero */
long cantidad;                 /* El número de bytes leídos */

int main()
{
    /* Accedo al fichero de origen */
    printf("Introduzca el nombre del fichero Origen: ");
    scanf("%s",nombreOrg);
    if ((fichOrg = fopen(nombreOrg, "rb")) == NULL)
    {
      printf("No existe el fichero origen!\n");
      exit(1);
    
    }
    /* Y ahora al de destino */
    printf("Introduzca el nombre del fichero Destino: ");
    scanf("%s",nombreDest);
    if ((fichDest = fopen(nombreDest, "wb")) == NULL)
    {
      printf("No se ha podido crear el fichero destino!\n");
      exit(2);
    }
    
    /* Miro la longitud del fichero de origen */
    fseek(fichOrg, 0, SEEK_END);
    longitud = ftell(fichOrg);
    fseek(fichOrg, 0, SEEK_SET);
    /* Reservo espacio para leer todo */
    buffer = (char *) malloc (longitud);
    if (buffer == NULL) 
    {
      printf("No se ha podido reservar tanto espacio!\n");
      exit(3);
    }
    /* Leo todos los datos a la vez */
    cantidad = fread( buffer, 1, longitud, fichOrg);
    /* Escribo tantos como haya leído */
    fwrite(buffer, 1, cantidad, fichDest);
    
    if (cantidad != longitud)
      printf("Cuidado: no se han leido (ni copiado) todos los datos\n");
      
    /* Cierro los ficheros */
    fclose(fichOrg);
    fclose(fichDest);

    return 0;
}