9.13. Un ejemplo: copiador de ficheros en una pasada
Curso: Fundamentos de programación en C, por Nacho Cabanes
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 <stdio.h> 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; }
Actualizado el: 27-07-2014 14:25