elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Agregar datos a mensajes de error en archivos con lenguaje C.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Agregar datos a mensajes de error en archivos con lenguaje C.  (Leído 2,388 veces)
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Agregar datos a mensajes de error en archivos con lenguaje C.
« en: 6 Mayo 2017, 17:52 pm »

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. -

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define MAX 80
  6.  
  7. void ingresarFrase( char frase[] );
  8. void copiar( char frase[] );
  9. void mostrar( void );
  10. void errorEscritura( void );
  11. void copiaDeSeguridad( const char *GtTxt, const char *GtBak );
  12. void mensaje( int par );
  13.  
  14. int main( void ){
  15. char frase[MAX];
  16.  
  17. ingresarFrase( frase );
  18. copiar( frase );
  19. mostrar(  );
  20. copiaDeSeguridad( "archGuiaTel.txt","archGuiaTel.bak" );
  21.  
  22.  
  23. return EXIT_SUCCESS;
  24. }
  25.  
  26. void ingresarFrase( char frase[] ){
  27. int ok=0;
  28.  
  29. do{
  30. printf( "\n Ingrese frase.....:" );
  31. fgets( frase, MAX, stdin );
  32. ok = strlen( frase );
  33. }while( ok <= 1 );
  34. }
  35.  
  36. void copiar( char frase[] ){
  37. FILE *ptrGtTxt;
  38. int par;
  39.  
  40. if( !(ptrGtTxt = fopen( "archGuiaTel.txt", "a+" ))){
  41. par = 1;
  42. mensaje( par );
  43. exit(1);
  44.    }
  45.  
  46. fprintf( ptrGtTxt, "%s", frase );
  47.  
  48. if( fflush( ptrGtTxt ) != 0){
  49. par = 2;
  50. mensaje( par );
  51. errorEscritura( );
  52. exit(1);
  53. }
  54.  
  55. if( ( fclose( ptrGtTxt ) ) ){
  56. par = 3;
  57. mensaje( par );
  58. exit(1);
  59. }
  60. }
  61.  
  62. void mostrar( void ){
  63. FILE *ptrGtTxt;
  64. char texto[100];
  65. int par;
  66.  
  67. if( !(ptrGtTxt = fopen( "archGuiaTel.txt", "r" ))){
  68. par = 4;
  69. mensaje( par );
  70. exit(1);
  71.    }
  72.  
  73. printf( "\n ========== Contenido del archivo ==========\n" );
  74. fgets( texto, 100, ptrGtTxt);
  75. while( feof(ptrGtTxt) == 0 ){
  76. printf( "%s",texto );
  77. fgets(texto, 100, ptrGtTxt);
  78. }
  79.  
  80. if( ( fclose( ptrGtTxt ) ) ){
  81. par = 5;
  82. mensaje( par );
  83. exit(1);
  84. }
  85. }
  86.  
  87. void errorEscritura( void ){
  88. int par;
  89.  
  90. if(remove( "archGuiaTel.txt" ) !=0 ){
  91. par = 6;
  92. mensaje( par );
  93. exit(1);
  94. }
  95.  
  96. if( rename( "archGuiaTel.bak","archGuiaTel.txt") !=0 ){
  97. par = 7;
  98. mensaje( par );
  99. exit(1);
  100. }
  101. }
  102.  
  103. void copiaDeSeguridad( const char *GtTxt, const char *GtBak ){
  104. FILE *ptrGtTxt, *ptrGtBak;  
  105. char c, x;
  106. int par;
  107.  
  108. if( !( ptrGtTxt = fopen( GtTxt, "r" ))){
  109. par = 8;
  110. mensaje( par );
  111. exit(1);                                
  112. }
  113. if( !( ptrGtBak = fopen( GtBak, "w" ))){
  114. par = 9;
  115. mensaje( par );
  116. exit(1);                                
  117. }
  118.  
  119. c = fgetc( ptrGtTxt );
  120. while ( c != EOF ){
  121. x = fputc( c, ptrGtBak );
  122. if (x != c){
  123. par = 10;
  124. mensaje( par );
  125. exit(1);                                
  126. }
  127. c = fgetc( ptrGtTxt );
  128. }
  129.  
  130. if( ( fclose( ptrGtTxt ) ) ){
  131. par = 11;
  132. mensaje( par );
  133. exit(1);                                
  134. }
  135. if( ( fclose( ptrGtBak ) ) ){
  136. par = 12;
  137. mensaje( par );
  138. exit(1);                                
  139. }
  140. }
  141.  
  142. void mensaje( int par ){
  143. int ch, a;
  144.  
  145. if( par == 1 ){
  146. printf( "\n No se pudo ABRIR el archivo, la frase no se pudo copiar" );
  147. printf( "\n El programa se cerrara sin cambios..." );
  148. }
  149. if( par == 2 ){
  150. printf( "\n No se pudo ESCRIBIR en el archivo..." );
  151. }
  152. if( par == 3 ){
  153. printf( "\n ===> No se pudo CERRAR el archivo..." );
  154. }
  155. if( par == 4 ){
  156. printf( "\n No se pudo ABRIR el archivo..." );
  157. }
  158. if( par == 5 ){
  159. printf( "\n No se pudo CERRAR el archivo..." );
  160. }
  161. if( par == 6 ){
  162. printf( "\n No se pudo BORRAR el archivo..." );
  163. }
  164. if( par == 7 ){
  165. printf( "\n No se pudo RENOMBRAR el archivo..." );
  166. }
  167. if( par == 8 ){
  168. printf( "\n No se pudo ABRIR el archivo(.txt)..." );
  169. }
  170. if( par == 9 ){
  171. printf( "\n No se pudo ABRIR el archivo(.bak)..." );
  172. }
  173. if( par == 10 ){
  174. printf( "\n No se pudo EFECTUAR la copia de seguridad..." );
  175. }
  176. if( par == 11 ){
  177. printf( "\n No se pudo CERRAR el archivo(.txt)..." );
  178. }
  179. if( par == 12 ){
  180. printf( "\n No se pudo CERRAR el archivo(.bak)..." );
  181. }
  182.  
  183.  
  184. printf( "\n Pulse una tecla para continuar..."); a = getchar();
  185.    if( a != '\n') while ((ch = getchar()) != EOF && ch != '\n');
  186. }
  187.  

Saludos.


En línea

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


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Agregar datos a mensajes de error en archivos con lenguaje C.
« Respuesta #1 en: 6 Mayo 2017, 18:17 pm »

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


En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Agregar datos a mensajes de error en archivos con lenguaje C.
« Respuesta #2 en: 9 Mayo 2017, 02:37 am »

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 . -

Citar
entrada.txt: No such file or directory

Código
  1. #include <stdio.h>
  2. #include <errno.h>
  3. #include <stdlib.h>
  4.  
  5. #define NOMBRE_ARCHIVO "entrada.txt"
  6.  
  7. int main( int argc,char **argv ){
  8. FILE *entrada;
  9.  
  10. if ( (entrada = fopen(NOMBRE_ARCHIVO, "rt")) == NULL ){
  11. perror( NOMBRE_ARCHIVO );
  12. exit( EXIT_FAILURE );
  13. }
  14.  
  15. fclose( entrada );
  16.  
  17. return EXIT_SUCCESS;
  18. }
Saludos.
En línea

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


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Agregar datos a mensajes de error en archivos con lenguaje C.
« Respuesta #3 en: 9 Mayo 2017, 07:15 am »

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

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Agregar datos a mensajes de error en archivos con lenguaje C.
« Respuesta #4 en: 12 Mayo 2017, 17:11 pm »

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. -

Código
  1. void copiar( char frase[] ){
  2. FILE *ptrGtTxt;
  3. char funcionError[20];
  4.  
  5. if( !(ptrGtTxt = fopen( N_A_TXT, "a+" ))){
  6. strcpy( funcionError, "copiarFopen" );
  7. mensaje( funcionError );
  8. exit(1);
  9.    }
  10.  
  11. fprintf( ptrGtTxt, "%s", frase );
  12.  
  13. fclose( ptrGtTxt );
  14. if( fflush( ptrGtTxt ) != 0){
  15. strcpy( funcionError, "copiarFflush" );
  16. mensaje( funcionError );
  17. errorEscritura( );
  18. exit(1);
  19. }
  20.  
  21. if( ( fclose( ptrGtTxt ) ) ){
  22. mensaje( funcionError );
  23. exit(1);
  24. }
  25. }
  26.  
  27.  
Código
  1. void mensaje( char funcionError[] ){
  2. int ch, a, errnum;;
  3. errnum = errno;
  4.  
  5. limpiar();
  6. printf("\n %d\n", errnum);
  7.  
  8. if( strcmp( funcionError,"copiarFopen") == 0 ){
  9. printf("\n Error al abrir el archivo \"%s\" \n El fichero o directorio no existe...", N_A_TXT);
  10. }
  11. if( strcmp( funcionError,"copiarFflush") == 0 ){
  12. printf("\n Error al abrir el archivo \"%s\" \n El fichero o directorio no existe...", N_A_TXT);
  13. }
  14.  
  15. printf( "\n\n\t Pulse <Enter> para finalizar..."); a = getchar();
  16.    if( a != '\n') while ((ch = getchar()) != EOF && ch != '\n');
  17. }

Saludos.
En línea

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.-
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines