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;
}