Autor Tema: Dudas al intentar cerrar un archivo con fclose y no lograrlo. -  (Leído 468 veces)

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

Desconectado Daniel1952

  • PIC10
  • *
  • Mensajes: 45
Dudas al intentar cerrar un archivo con fclose y no lograrlo. -
« en: 01 de Marzo de 2017, 13:06:19 »
Hola,  que tengan un muy buen día. -
La duda es que se debe hacer cuando la función fclose intenta cerrar un archivo y no lo logra, ¿hay alguna manera de informar el error con detalle, se debe intentar una segunda vez, que puedo hacer como programador para ayudar a solucionar el problema?. -
 
Código: C
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(int argc,char **argv){
  5.         char frase[] = "arequito, centro soguero del pais";
  6.         FILE *ptrFrase = NULL;
  7.  
  8.         if(!(ptrFrase = fopen("frase.txt", "w"))){
  9.                 printf( "\n Error al abrir %s Para escribir. Finaliza el programa.", frase );
  10.                 exit(1);
  11.         }
  12.  
  13.         fprintf(ptrFrase, "%s", frase);
  14.        
  15.         if( fclose( ptrFrase )!=0){
  16.                 printf( "\n No se ha podido cerrar el fichero %s.", frase );
  17.         }
  18.        
  19.         return EXIT_SUCCESS;
  20. }
  21.  
  22. //https://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Manejo_de_archivos#fprintf
  23.  
Es todo por el momento, espero que se entienda . -
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.-

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4354
    • Picuino
Re:Dudas al intentar cerrar un archivo con fclose y no lograrlo. -
« Respuesta #1 en: 01 de Marzo de 2017, 16:33:51 »
A mi me funciona bien.
Prueba con este compilador: http://www.bellard.org/tcc/

Guarda el programa en un archivo llamado:
files.c

Ejecuta el archivo desde la línea de comandos con la orden:
tcc.exe -run files.c

Y todo sale bien.

Desconectado Daniel1952

  • PIC10
  • *
  • Mensajes: 45
Re:Dudas al intentar cerrar un archivo con fclose y no lograrlo. -
« Respuesta #2 en: 01 de Marzo de 2017, 16:50:54 »
Hola, Picuino.
Veo que no me entendiste, yo no digo que no me funciona, sí que el programa me funciona perfectamente, lo que yo digo es que en el hipotético caso que fclose no pueda cerrar el archivo que puedo hacer yo como programador para informar o solucionar el problema. -

Muchas gracias por ocuparte. -
Daniel
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.-

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4354
    • Picuino
Re:Dudas al intentar cerrar un archivo con fclose y no lograrlo. -
« Respuesta #3 en: 01 de Marzo de 2017, 18:36:13 »
Lo normal es que dé problemas al abrir, no al cerrar.
Todo depende de la aplicación. Puedes informar con un mensaje de texto o con un valor de error en el retorno de la función.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4354
    • Picuino
Re:Dudas al intentar cerrar un archivo con fclose y no lograrlo. -
« Respuesta #4 en: 01 de Marzo de 2017, 18:38:20 »
Prueba buscando esto:
fclose error handling

Un saludo.

Desconectado Daniel1952

  • PIC10
  • *
  • Mensajes: 45
Re:Dudas al intentar cerrar un archivo con fclose y no lograrlo. -
« Respuesta #5 en: 02 de Marzo de 2017, 11:15:25 »
Hola.
Me parece interesante la búsqueda que propones, si bien todo está en inglés voy a tratar de traducirlo, si encuentro algo muy interesante luego lo posteo. -

Saludos y gracias.
Daniel
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.-

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4354
    • Picuino
Re:Dudas al intentar cerrar un archivo con fclose y no lograrlo. -
« Respuesta #6 en: 02 de Marzo de 2017, 12:20:09 »
Es que ese tema es un poco raro y muy técnico. Si no buscas en inglés es difícil encontrar algo.
En stackoverflow te aparecen tres entradas interesantes.

En resumen, lo mejor es hacer primero fflush() y fsync() antes de hacer fclose().
Si fclose() te da error pero las anteriores no, entonces no ha habido corrupción de datos al escribir el buffer y el archivo está bien.
Nunca intentes cerrar dos veces un archivo porque puede dar problemas y un comportamiento no controlado.

Si intentas fflush() o fsync() y te da error, eso es otro problema. Te puede pasar al escribir en un pendrive que se ha retirado bien o mal.
el archivo físico puede estar corrompido o no, pero te has quedado sin escribir el buffer con los últimos datos.

El tratamiento depende mucho de la aplicación y de lo que estés haciendo. Pero estos errores tienen mal pronóstico. Casi seguro que ha pasado algo irrecuperable.

Un saludo.

Desconectado Daniel1952

  • PIC10
  • *
  • Mensajes: 45
Re:Dudas al intentar cerrar un archivo con fclose y no lograrlo. -
« Respuesta #7 en: 03 de Marzo de 2017, 13:03:12 »
Hola, los molesto nuevamente.
Tengo una duda con la línea 44 y es a partir de lo que escribió KILLERJC en este post, http://www.todopic.com.ar/foros/index.php?topic=47256.0
lo que intento es vaciar el buffer del teclado por si alguien escribe algo antes de apretar Enter lo que sucede es que si no se escribe nada y se aprieta Enter (como debería ser) el bucle no encuentra el salto de línea porque se lo comió la función getchar() y unicamente se sale del mismo apretando Enter(nuevamente),
como tengo leído no se puede acceder al buffer del teclado de forma interactiva, caso contrario pondría un '\n' y estaría todo ok, alguien tiene alguna sugerencia para que esto no pase.

Código: C
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void mensaje( int orden );
  5.  
  6. int main(int argc,char **argv){
  7.         int orden = 0;
  8.         char frase[] = "Arequito, centro soguero del pais";
  9.         FILE *ptrFrase = NULL;
  10.  
  11.         if(!(ptrFrase = fopen("frase.txt", "w"))){
  12.                 mensaje( orden );
  13.                 exit(1);
  14.         }
  15.  
  16.         fprintf(ptrFrase, "%s", frase);
  17.  
  18.         if( fflush( ptrFrase ) == EOF){
  19.                 orden = 1;
  20.                 mensaje( orden );
  21.         }
  22.  
  23.         if(fclose( ptrFrase ) == EOF){
  24.                 orden = 2;
  25.                 mensaje( orden );
  26.         }      
  27.  
  28.         return EXIT_SUCCESS;
  29. }
  30.  
  31.  
  32. void mensaje( int orden ){
  33.         int ch;
  34.  
  35.         if( orden == 0){
  36.                 printf( "\n Error al abrir el fichero Para escribir. Finaliza el programa." );
  37.         }else if( orden == 1){
  38.                 printf( "\n No se ha podido escribir en el fichero \n" );
  39.         }else if( orden == 2){
  40.                 printf( "\n No se ha podido cerrar el fichero \n" );
  41.         }
  42.  
  43.         printf( "\n Pulse una tecla para continuar...\n"); getchar();
  44.         while ((ch = getchar()) != EOF && ch != '\n');
  45. }
  46.  
Saludos.
Daniel
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.-

Desconectado Daniel1952

  • PIC10
  • *
  • Mensajes: 45
Re:Dudas al intentar cerrar un archivo con fclose y no lograrlo. -
« Respuesta #8 en: 05 de Marzo de 2017, 13:54:35 »
Hola, que tengan un muy buen día. -
Pasé casi 2 días buscando una manera de solucionar esto y no se imaginan cuántos [F5] en este foro, pero al fin parece que lo logre, no hice muchas prácticas pero creo que no debería dejar margen para generar algún error. -

Código: C
  1. void mensaje( int orden ){
  2.         int ch;
  3.         char a;
  4.  
  5.         if( orden == 0){
  6.                 printf( "\n Error al abrir el fichero Para escribir. Finaliza el programa." );
  7.         }else if( orden == 1){
  8.                 printf( "\n No se ha podido escribir en el fichero \n" );
  9.         }else if( orden == 2){
  10.                 printf( "\n No se ha podido cerrar el fichero \n" );
  11.         }
  12.  
  13.         printf( "\n Pulse una tecla para continuar...");  a = getchar();
  14.         if( a != '\n') while ((ch = getchar()) != EOF && ch != '\n');
  15. }

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

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4354
    • Picuino
Re:Dudas al intentar cerrar un archivo con fclose y no lograrlo. -
« Respuesta #9 en: 05 de Marzo de 2017, 18:29:32 »
También puedes utilizar la versión no estándar, sin buffer y muy rápida getch()

Desconectado Daniel1952

  • PIC10
  • *
  • Mensajes: 45
Re:Dudas al intentar cerrar un archivo con fclose y no lograrlo. -
« Respuesta #10 en: 06 de Marzo de 2017, 11:29:48 »
Hola, Picuino.
Gracias por el aporte, pero según tengo leído esa función pertenece a la librería conio.h y no es para nada portable además mi sistema operativo es Ubuntu. -

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

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4354
    • Picuino
Re:Dudas al intentar cerrar un archivo con fclose y no lograrlo. -
« Respuesta #11 en: 06 de Marzo de 2017, 12:24:20 »
Como dije, no es estándar. La idea es leer el teclado de forma inmediata, sin buffer que espere a pulsar enter.
El equivalente Linux creo que es termio.h