#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 80
void copiaDeSeguridad( FILE *ptrGuiaTel, FILE *ptrGtTemp ); //GT0001
void ingresarFrase( char frase[] ); //GT0002
void copiar( FILE *ptrGuiaTel, FILE *ptrGtTemp, char frase[] ); //GT0003
void errorEscritura( FILE *ptrGuiaTel, FILE *ptrGtTemp ); //GT0004
void mensaje( void );
int main( int argc,char **argv ){
FILE *ptrGuiaTel = NULL, *ptrGtTemp = NULL;
char frase[MAX];
copiaDeSeguridad( ptrGuiaTel, ptrGtTemp ); //GT0001
ingresarFrase( frase ); //GT0002
copiar( ptrGuiaTel, ptrGtTemp, frase ); //GT0003
return EXIT_SUCCESS;
}
void copiaDeSeguridad( FILE *ptrGuiaTel, FILE *ptrGtTemp ){ //GT0001
char c, x;
if( !( ptrGuiaTel
= fopen( "archGuiaTel.txt", "r" ))){ mensaje();
}
if( !( ptrGtTemp
= fopen( "archGtTemp.txt", "w" ))){ mensaje();
}
while ( c != EOF ){
x
= fputc( c
, ptrGtTemp
); if (x != c){
mensaje();
}
}
if( ( fclose( ptrGuiaTel
) ) ){ mensaje();
}
if( ( fclose( ptrGtTemp
) ) ){ mensaje();
}
}
void ingresarFrase( char frase[] ){ //GT0002
int ok=0;
do{
printf( "\n Ingrese frase.....:" ); fgets( frase
, MAX
, stdin
); }while( ok <= 1 );
}
void copiar( FILE *ptrGuiaTel, FILE *ptrGtTemp, char frase[] ){ //GT0003
if( !(ptrGuiaTel
= fopen( "archGuiaTel.txt", "a" ))){ mensaje();
}
fprintf( ptrGuiaTel
, "%s", frase
);
if( fflush( ptrGuiaTel
) != 0){ mensaje();
errorEscritura( ptrGuiaTel, ptrGtTemp ); //GT0004
}
if( ( fclose( ptrGuiaTel
) ) ){ mensaje();
}
}
void errorEscritura( FILE *ptrGuiaTel, FILE *ptrGtTemp ){ //GT0004
if( rename("archGtTemp.txt","archGuiaTel.txt") !=0 ){ mensaje();
}
if(remove( "archGuiaTel.txt") !=0 ){ mensaje();
}
}
void mensaje( void ){
int ch, a;
printf( "\n Ha ocurrido un error y el programa finaliza sin cambios en el archivo." ); if( a
!= '\n') while ((ch
= getchar()) != EOF
&& ch
!= '\n'); }
/*
GT0001 - Función copiaDeSeguridad
Efectúo una copia del archivo original por si fallara la escritura en el mismo, si esto
ocurriera renombro la copia con el mismo nombre que el archivo original y a este lo borro,
con esto me aseguro que el archivo en disco no quede corrupto. -
Si fallara la apertura de los archivos archGuiaTel.txt o archGtTemp.txt imprimo un mensaje
y cierro el programa (mensaje y exit(1)), lo mismo ocurrirá si falla la escritura en el archivo temporal (if (x != c){).-
Si la apertura de los 2 archivos es correcta como así la escritura, solo queda constatar si
el cierre de los mismos ocurre sin errores, de lo contrario se procederá de la misma manera que en la apertura de los mismos (mensaje y exit (1). -
Nota: En esta función se abre y se cierra el archivo "archGtTemp.txt".
//GT0002 - Función ingresarFrase
El do-while es para que no se pueda salir de la función si no se ha ingresado por lo menos
un dígito.-
//GT0003 - Función copiar
Con fprintf( ptrGuiaTel, "%s", frase ); copio la frase en el buffer intermedio y con fflush
copio la frase desde el buffer al disco rígido(archGuiaTel.txt).-
Verifico si la apertura y cierre del archivo ocurre sin errores.-
En el caso de que fallara fflush llamo a la (//GT0004) función errorEscritura para renombrar el archivo archGtTemp.txt
por archGuiaTel.txt para luego borrar el archivo original que
seguramente si no se pudo escribir es porque está corrupto(al final con remove lo borro). -
*/