Otro nuevo ejercicio de c para seguir el curso de teleformacion autodidacta y así poder practicas con ejemplos uno de tus lenguajes de programación favorito.
Enunciado del ejercicio:
Realizar un programa que invierta un fichero de texto creando uno nuevo ( es decir el fichero de destino o final ha de tener el contenido del primero u origen pero al revés ), en vez de solicitar los nombres de archivos en el programa se utiliza la línea de parámetros como si de una orden de linux o ms-dos se tratara. Se utiliza para leer y grabar las funciones fread y fwrite, realizando una reserva de memoria dinámica con la función malloc, y la función free para liberar la memoria utilizada. El ejercicio se ha realizado utilizando el editor Code Blocks bajo Windows 7 y probado en la consola de comandos de Windows 7.
El ejercicio resuelto es el siguiente:
#include <stdio.h>
#include <stdlib.h>
// Predefinición de funciones
int Existe(char *);
long int Tamanyo(char *);
// Función principal
int main(int argc,char *argv[])
{
// Comprobación del numero de parámetros recibido
if(argc!=3) {
printf("\n¡Faltan parámetros");
printf("\nFormato: comando fichero_origen fichero_destino");
exit(1);
}
// Comprobación de ficheros
if(Existe(argv[1])==1) {
printf("\nEl fichero de origen no se ha encontrado o no existe...");
exit(1);
}
// Declaración de variables necesarias
FILE *fichero;
long int cuantos;
char *reserva=NULL;
int contador;
// Abrir archivo en modo lectura
fichero=fopen(argv[1],"rt");
// Averiguar el tamaño del archivo
cuantos=Tamanyo(argv[1]);
// Realizar la reserva de memoria correspondiente al tamanyo del fichero
reserva=(char *)malloc(sizeof(char)*cuantos);
// leer el archivo completo y almacenarlo en la variable reserva
fread(reserva,sizeof(char),cuantos,fichero);
// Cerrar fichero de origen
fclose(fichero);
// abrir archivo destino
fichero=fopen(argv[2],"wt");
// en caso de error devolver error y salir
if(!fichero) {
printf("\nNo se ha podido crear el archivo destino...");
exit(1);
}
// si no existe error recorrer el vector creado en orden inverso
// y almacenarlo en el archivo destino
printf("\nInvertir archivo");
for(contador=cuantos;contador>=0;contador--)
{
fwrite(&reserva[contador],sizeof(char),1,fichero);
printf(".");
}
// cerrar el archivo destino
fclose(fichero);
// finalizar programa
printf("Ok\n");
// Liberar memoria
free(reserva);
return 0;
}
// Función Existe
int Existe(char *nombre_fichero)
{
FILE *fichero;
int resultado=0; // 0 = existe 1 = no existe
fichero=fopen(nombre_fichero,"rt");
if(fichero!=NULL) {
fclose(fichero);
} else {
resultado=1;
}
return resultado;
}
// Función contador
long int Tamanyo(char *nombre_fichero)
{
FILE *fichero;
long int contador=0;
char caracter=0;
fichero=fopen(nombre_fichero,"rt");
fread(&caracter,1,sizeof(caracter),fichero);
while(!feof(fichero))
{
contador++;
fread(&caracter,1,sizeof(caracter),fichero);
}
fclose(fichero);
return contador;
}