Agregar datos a mensajes de error en archivos con lenguaje C.

Iniciado por NOB2014, 6 Mayo 2017, 17:52 PM

0 Miembros y 1 Visitante están viendo este tema.

NOB2014

Hola, que tengan un muy buen día.
Lo que no puedo encontrar es información de porque ocurren los errores en archivos, quisiera informar al operario que pasó si por Ej. no se pudo abrir un archivo, o si no se pudo crear el archivo .bak, desconozco si esto es privativo del sistema operativo o si tiene que ver con el lenguaje. -
También me interesaría completar el mensaje con que hacer para que esto no ocurra nuevamente. -
Deje el programa(sin terminar) por si les ayuda en algo para entender mi pedido. -

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 80

void ingresarFrase( char frase[] );
void copiar( char frase[] );
void mostrar( void );
void errorEscritura( void );
void copiaDeSeguridad( const char *GtTxt, const char *GtBak );
void mensaje( int par );
 
int main( void ){
char frase[MAX];

ingresarFrase( frase );
copiar( frase );
mostrar(  );
copiaDeSeguridad( "archGuiaTel.txt","archGuiaTel.bak" );


return EXIT_SUCCESS;
}
 
void ingresarFrase( char frase[] ){
int ok=0;

do{
printf( "\n Ingrese frase.....:" );
fgets( frase, MAX, stdin );
ok = strlen( frase );
}while( ok <= 1 );
}
       
void copiar( char frase[] ){
FILE *ptrGtTxt;
int par;

if( !(ptrGtTxt = fopen( "archGuiaTel.txt", "a+" ))){
par = 1;
mensaje( par );
exit(1);
    }

fprintf( ptrGtTxt, "%s", frase );

if( fflush( ptrGtTxt ) != 0){
par = 2;
mensaje( par );
errorEscritura( );
exit(1);
}

if( ( fclose( ptrGtTxt ) ) ){
par = 3;
mensaje( par );
exit(1);
}
}

void mostrar( void ){
FILE *ptrGtTxt;
char texto[100];
int par;

if( !(ptrGtTxt = fopen( "archGuiaTel.txt", "r" ))){
par = 4;
mensaje( par );
exit(1);
    }

printf( "\n ========== Contenido del archivo ==========\n" );
fgets( texto, 100, ptrGtTxt);
while( feof(ptrGtTxt) == 0 ){
printf( "%s",texto );
fgets(texto, 100, ptrGtTxt);
}

if( ( fclose( ptrGtTxt ) ) ){
par = 5;
mensaje( par );
exit(1);
}
}

void errorEscritura( void ){
int par;

if(remove( "archGuiaTel.txt" ) !=0 ){
par = 6;
mensaje( par );
exit(1);
}

if( rename( "archGuiaTel.bak","archGuiaTel.txt") !=0 ){
par = 7;
mensaje( par );
exit(1);
}
}

void copiaDeSeguridad( const char *GtTxt, const char *GtBak ){
FILE *ptrGtTxt, *ptrGtBak; 
char c, x;
int par;

if( !( ptrGtTxt = fopen( GtTxt, "r" ))){
par = 8;
mensaje( par );
exit(1);                               
}
if( !( ptrGtBak = fopen( GtBak, "w" ))){
par = 9;
mensaje( par );
exit(1);                               
}
     
c = fgetc( ptrGtTxt );
while ( c != EOF ){
x = fputc( c, ptrGtBak );
if (x != c){
par = 10;
mensaje( par );
exit(1);                               
}
c = fgetc( ptrGtTxt );
}
     
if( ( fclose( ptrGtTxt ) ) ){
par = 11;
mensaje( par );
exit(1);                               
}
if( ( fclose( ptrGtBak ) ) ){
par = 12;
mensaje( par );
exit(1);                               
}
}

void mensaje( int par ){
int ch, a;

if( par == 1 ){
printf( "\n No se pudo ABRIR el archivo, la frase no se pudo copiar" );
printf( "\n El programa se cerrara sin cambios..." );
}
if( par == 2 ){
printf( "\n No se pudo ESCRIBIR en el archivo..." );
}
if( par == 3 ){
printf( "\n ===> No se pudo CERRAR el archivo..." );
}
if( par == 4 ){
printf( "\n No se pudo ABRIR el archivo..." );
}
if( par == 5 ){
printf( "\n No se pudo CERRAR el archivo..." );
}
if( par == 6 ){
printf( "\n No se pudo BORRAR el archivo..." );
}
if( par == 7 ){
printf( "\n No se pudo RENOMBRAR el archivo..." );
}
if( par == 8 ){
printf( "\n No se pudo ABRIR el archivo(.txt)..." );
}
if( par == 9 ){
printf( "\n No se pudo ABRIR el archivo(.bak)..." );
}
if( par == 10 ){
printf( "\n No se pudo EFECTUAR la copia de seguridad..." );
}
if( par == 11 ){
printf( "\n No se pudo CERRAR el archivo(.txt)..." );
}
if( par == 12 ){
printf( "\n No se pudo CERRAR el archivo(.bak)..." );
}


printf( "\n Pulse una tecla para continuar..."); a = getchar();
    if( a != '\n') while ((ch = getchar()) != EOF && ch != '\n');
}


Saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

MAFUS

C provée un mecanismo para el control de errores. Como sabes las funciones devuelven información con de lo que han hecho o un código de error si no han conseguido realizar un trabajo. Además hay una variable local llamada errno que indica el último fallo ocurrido y por eso siempre debes comprobarla después de llamar a la función que te interesa controlar. Hay diferentes funciones para ello. Te recomiendo seguir el siguiente artículo: https://www.tutorialspoint.com/cprogramming/c_error_handling.htm

NOB2014

Hola, MAFUS.
Hice este pequeño código para entender un poco mejor el asunto y la pregunta que me surge es, puedo capturar el error antes de imprimirlo y traducirlo al español? >:D >:D >:D . -

Citarentrada.txt: No such file or directory

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>

#define NOMBRE_ARCHIVO "entrada.txt"

int main( int argc,char **argv ){
FILE *entrada;

if ( (entrada = fopen(NOMBRE_ARCHIVO, "rt")) == NULL ){
perror( NOMBRE_ARCHIVO );
exit( EXIT_FAILURE );
}

fclose( entrada );

return EXIT_SUCCESS;
}

Saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

MAFUS

No, deberías, oara eso, montarte tu propia función de tratamiento de errores según errno.

NOB2014

Hola, ¿cómo están?
MAFUS estoy haciendo lo que me sugeriste, ahora me encuentro con que no logro forzar que fflush falle, si abro el archivo para solo lectura errno me da el error 9  (Bad file descriptor) esto ya lo tengo pero lo que quiero es producir el error cerrando el archivo antes de escribir con fflush pero lo que hace es no escribir en el archivo pero no me muestra ningún error, alguien me podria decir como debo hacer. -

void copiar( char frase[] ){
FILE *ptrGtTxt;
char funcionError[20];

if( !(ptrGtTxt = fopen( N_A_TXT, "a+" ))){
strcpy( funcionError, "copiarFopen" );
mensaje( funcionError );
exit(1);
    }

fprintf( ptrGtTxt, "%s", frase );

fclose( ptrGtTxt );
if( fflush( ptrGtTxt ) != 0){
strcpy( funcionError, "copiarFflush" );
mensaje( funcionError );
errorEscritura( );
exit(1);
}

if( ( fclose( ptrGtTxt ) ) ){
mensaje( funcionError );
exit(1);
}
}

void mensaje( char funcionError[] ){
int ch, a, errnum;;
errnum = errno;

limpiar();
printf("\n %d\n", errnum);

if( strcmp( funcionError,"copiarFopen") == 0 ){
printf("\n Error al abrir el archivo \"%s\" \n El fichero o directorio no existe...", N_A_TXT);
}
if( strcmp( funcionError,"copiarFflush") == 0 ){
printf("\n Error al abrir el archivo \"%s\" \n El fichero o directorio no existe...", N_A_TXT);
}

printf( "\n\n\t Pulse <Enter> para finalizar..."); a = getchar();
    if( a != '\n') while ((ch = getchar()) != EOF && ch != '\n');
}


Saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-