Autor Tema: Plantilla para trabajar con archivos [C]  (Leído 2001 veces)

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

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Plantilla para trabajar con archivos [C]
« en: 11 de Abril de 2017, 13:49:22 »
Hola, Que tengan un muy buen día.-
Lo que me trae en este caso no es para pedir ayuda porque el programa no funciona, lo que quisiera es que me digan que debería cambiar, que les parece, ¿está bien encarado?, estoy consiente que esto se lo debería preguntar a un profe o a un amigo, pero como ya algunos conocen por mi edad (65) no tengo ni una cosa ni la otra,-
Es todo, espero que alguien con mucho tiempo lo revice, desde ya muchas gracias. -   

Código: C
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define MAX 80
  6.  
  7. void copiaDeSeguridad( FILE *ptrGuiaTel, FILE *ptrGtTemp );             //GT0001
  8. void ingresarFrase( char frase[] );                                                             //GT0002
  9. void copiar( FILE *ptrGuiaTel, FILE *ptrGtTemp, char frase[] ); //GT0003
  10. void errorEscritura( FILE *ptrGuiaTel, FILE *ptrGtTemp );               //GT0004
  11. void mensaje( void );
  12.  
  13.  
  14. int main( int argc,char **argv ){
  15.         FILE *ptrGuiaTel = NULL, *ptrGtTemp = NULL;
  16.         char frase[MAX];
  17.        
  18.         copiaDeSeguridad( ptrGuiaTel, ptrGtTemp );                                      //GT0001
  19.         ingresarFrase( frase );                                                                         //GT0002
  20.         copiar( ptrGuiaTel, ptrGtTemp, frase );                                         //GT0003       
  21.  
  22.         return EXIT_SUCCESS;
  23. }
  24.  
  25.  
  26. void copiaDeSeguridad( FILE *ptrGuiaTel, FILE *ptrGtTemp ){             //GT0001
  27.         char c, x;
  28.  
  29.         if( !( ptrGuiaTel = fopen( "archGuiaTel.txt", "r" ))){
  30.                 mensaje();
  31.                 exit(1);                               
  32.         }
  33.         if( !( ptrGtTemp = fopen( "archGtTemp.txt", "w" ))){
  34.                 mensaje();
  35.                 exit(1);                               
  36.         }
  37.  
  38.         c = fgetc( ptrGuiaTel );
  39.         while ( c != EOF ){
  40.                 x = fputc( c, ptrGtTemp );
  41.                 if (x != c){
  42.                         mensaje();
  43.                         exit(1);                               
  44.                 }
  45.                 c = fgetc( ptrGuiaTel );
  46.         }
  47.  
  48.         if( ( fclose( ptrGuiaTel ) ) ){
  49.                 mensaje();
  50.                 exit(1);                               
  51.         }
  52.         if( ( fclose( ptrGtTemp ) ) ){
  53.                 mensaje();
  54.                 exit(1);                               
  55.         }
  56. }
  57.  
  58. void ingresarFrase( char frase[] ){             //GT0002
  59.         int ok=0;
  60.  
  61.         do{    
  62.                 printf( "\n Ingrese frase.....:" );
  63.                 fgets( frase, MAX, stdin );
  64.                 ok = strlen( frase );
  65.         }while( ok <= 1 );
  66. }
  67.  
  68. void copiar( FILE *ptrGuiaTel, FILE *ptrGtTemp, char frase[] ){         //GT0003
  69.  
  70.         if( !(ptrGuiaTel = fopen( "archGuiaTel.txt", "a" ))){
  71.                 mensaje();
  72.                 exit(1);                               
  73.         }
  74.        
  75.         fprintf( ptrGuiaTel, "%s", frase );
  76.  
  77.         if( fflush( ptrGuiaTel ) != 0){
  78.                 mensaje();
  79.                 fclose( ptrGuiaTel );
  80.                 errorEscritura( ptrGuiaTel, ptrGtTemp );        //GT0004
  81.                 exit(1);                               
  82.         }
  83.        
  84.         if( ( fclose( ptrGuiaTel ) ) ){
  85.                 mensaje();
  86.                 exit(1);                               
  87.         }
  88. }
  89.  
  90. void errorEscritura( FILE *ptrGuiaTel, FILE *ptrGtTemp ){       //GT0004
  91.        
  92.         if( rename("archGtTemp.txt","archGuiaTel.txt") !=0 ){
  93.                 mensaje();
  94.                 exit(1);                               
  95.         }
  96.  
  97.         if(remove( "archGuiaTel.txt") !=0 ){
  98.                 mensaje();
  99.                 exit(1);                               
  100.         }
  101. }
  102.  
  103. void mensaje( void ){
  104.         int ch, a;
  105.        
  106.         printf( "\n Ha ocurrido un error y el programa finaliza sin cambios en el archivo." );
  107.         printf( "\n Pulse una tecla para continuar..."); a = getchar();
  108.         if( a != '\n') while ((ch = getchar()) != EOF && ch != '\n');
  109. }
  110.  
  111. /*
  112.         GT0001 - Función copiaDeSeguridad
  113.                 Efectúo una copia del archivo original por si fallara la escritura en el mismo, si esto
  114.                 ocurriera renombro la copia con el mismo nombre que el archivo original y a este lo borro,
  115.                 con esto me aseguro que el archivo en disco no quede corrupto. -
  116.                 Si fallara la apertura de los archivos archGuiaTel.txt o archGtTemp.txt imprimo un mensaje
  117.                 y cierro el programa (mensaje y exit(1)), lo mismo ocurrirá si falla la escritura en el archivo temporal (if (x != c){).-
  118.                 Si la apertura de los 2 archivos es correcta como así la escritura, solo queda constatar si
  119.                 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). -
  120.                 Nota: En esta función se abre y se cierra el archivo "archGtTemp.txt".
  121.         //GT0002 - Función ingresarFrase  
  122.                 El do-while es para que no se pueda salir de la función si no se ha ingresado por lo menos
  123.                 un dígito.-   
  124.         //GT0003 - Función copiar
  125.                 Con fprintf( ptrGuiaTel, "%s", frase ); copio la frase en el buffer intermedio y con fflush
  126.                 copio la frase desde el buffer al disco rígido(archGuiaTel.txt).-               
  127.                 Verifico si la apertura y cierre del archivo ocurre sin errores.-
  128.                 En el caso de que fallara fflush llamo a la (//GT0004) función errorEscritura para renombrar el archivo archGtTemp.txt
  129.                 por archGuiaTel.txt para luego borrar el archivo original que
  130.                 seguramente si no se pudo escribir es porque está corrupto(al final con remove lo borro). -
  131. */

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 KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Plantilla para trabajar con archivos [C]
« Respuesta #1 en: 11 de Abril de 2017, 14:30:24 »
Para mi esta bien, lo que veo "redundante" es pasar los punteros FILE como argumento, ya que no tienen ningun sentido pasarlos. Me explico con un ejemplo.. Este parte funcionaria igual si fuera asi:

Código: C
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define MAX 80
  6.  
  7. void copiaDeSeguridad(void);             //GT0001
  8. void ingresarFrase( char frase[] );                                                             //GT0002
  9. void copiar(char frase[] ); //GT0003
  10. void errorEscritura(void);               //GT0004
  11. void mensaje( void );
  12.  
  13.  
  14. int main( int argc,char **argv ){
  15.          char frase[MAX];
  16.        
  17.         copiaDeSeguridad();                                      //GT0001
  18.         ingresarFrase(frase);                                                                         //GT0002
  19.         copiar(frase);                                         //GT0003        
  20.  
  21.         return EXIT_SUCCESS;
  22. }
  23.  
  24.  
  25. void copiaDeSeguridad(void){             //GT0001
  26.         FILE *ptrGuiaTel, *ptrGtTemp;  
  27.         char c, x;
  28.  
  29.         if( !( ptrGuiaTel = fopen( "archGuiaTel.txt", "r" ))){
  30.                 mensaje();
  31.                 exit(1);                                
  32.         }
  33.         if( !( ptrGtTemp = fopen( "archGtTemp.txt", "w" ))){
  34.                 mensaje();
  35.                 exit(1);                                
  36.         }
  37.  
  38.         c = fgetc( ptrGuiaTel );
  39.         while ( c != EOF ){
  40.                 x = fputc( c, ptrGtTemp );
  41.                 if (x != c){
  42.                         mensaje();
  43.                         exit(1);                                
  44.                 }
  45.                 c = fgetc( ptrGuiaTel );
  46.         }
  47.  
  48.         if( ( fclose( ptrGuiaTel ) ) ){
  49.                 mensaje();
  50.                 exit(1);                                
  51.         }
  52.         if( ( fclose( ptrGtTemp ) ) ){
  53.                 mensaje();
  54.                 exit(1);                                
  55.         }
  56. }
  57.  
  58. void ingresarFrase( char frase[] ){             //GT0002
  59.         int ok=0;
  60.  
  61.         do{    
  62.                 printf( "\n Ingrese frase.....:" );
  63.                 fgets( frase, MAX, stdin );
  64.                 ok = strlen( frase );
  65.         }while( ok <= 1 );
  66. }
  67.  
  68. void copiar(char frase[] ){         //GT0003
  69.  
  70.         FILE *ptrGuiaTel, *ptrGtTemp;  
  71.  
  72.         if( !(ptrGuiaTel = fopen( "archGuiaTel.txt", "a" ))){
  73.                 mensaje();
  74.                 exit(1);                                
  75.         }
  76.        
  77.         fprintf( ptrGuiaTel, "%s", frase );
  78.  
  79.         if( fflush( ptrGuiaTel ) != 0){
  80.                 mensaje();
  81.                 fclose( ptrGuiaTel );
  82.                 errorEscritura();        //GT0004
  83.                 exit(1);                                
  84.         }
  85.        
  86.         if( ( fclose( ptrGuiaTel ) ) ){
  87.                 mensaje();
  88.                 exit(1);                                
  89.         }
  90. }
  91.  
  92. void errorEscritura(void){       //GT0004
  93.        
  94.         if( rename("archGtTemp.txt","archGuiaTel.txt") !=0 ){
  95.                 mensaje();
  96.                 exit(1);                                
  97.         }
  98.  
  99.         if(remove( "archGuiaTel.txt") !=0 ){
  100.                 mensaje();
  101.                 exit(1);                                
  102.         }
  103. }
  104.  
  105. void mensaje( void ){
  106.         int ch, a;
  107.        
  108.         printf( "\n Ha ocurrido un error y el programa finaliza sin cambios en el archivo." );
  109.         printf( "\n Pulse una tecla para continuar..."); a = getchar();
  110.         if( a != '\n') while ((ch = getchar()) != EOF && ch != '\n');
  111. }

Porque realmente no sirve de nada mantener en memoria los punteros... Tampoco el puntero te sirve porque cerras el archivo al finalizar la funcion y dejan de ser validos. Entonces tenerlos en el main significa ocupar espacio del stack sin sentido y ademas ocupar espacio de nombres que luego podrias llegar a usar.

Tal ves lo que vos buscas es tener una llamada asi:

Código: C
  1. copiaDeSeguridad("archGuiaTel.txt","archGtTemp.txt");

Eso te permitiria tener una funcion que lo podes usar con cualquier nombre de archivo y no tenes que estar tocando la funcion "copiaDeSeguridad", ejemplo tengo los archivos arc1.txt,arc2.txt y quiero hacer un backup entonces solo haria:

Código: C
  1. copiaDeSeguridad("arc1.txt","arc1.bak");
  2. copiaDeSeguridad("arc2.txt","arc2.bak");

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Plantilla para trabajar con archivos [C]
« Respuesta #2 en: 13 de Abril de 2017, 09:08:20 »
Hola.
Muchas gracias por ocuparte, la primera parte la entendí perfectamente y en el futuro voy a tener mucho cuidado al respecto porque es un error que vengo arrastrando desde hace demasiado tiempo. -
Con respecto a:
Citar
Código: C
    copiaDeSeguridad("archGuiaTel.txt","archGtTemp.txt");


Eso te permitiria tener una funcion que lo podes usar con cualquier nombre de archivo y no tenes que estar tocando la funcion "copiaDeSeguridad", ejemplo tengo los archivos arc1.txt,arc2.txt y quiero hacer un backup entonces solo haria:

Código: C

    copiaDeSeguridad("arc1.txt","arc1.bak");
    copiaDeSeguridad("arc2.txt","arc2.bak");
por más que busco y pienso en lo que propones no logro entender ni llevar a la práctica, si no te resultara muy tedioso, ¿podrías poner algún pequeño ejemplo de código? -

saludos y nuevamente, gracias. -
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 KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Plantilla para trabajar con archivos [C]
« Respuesta #3 en: 13 de Abril de 2017, 11:56:01 »
Te paso una funcion. Esto deberia hacerlo funcionar de esa manera:

Código: C
  1. void copiaDeSeguridad(const char *nameGuiaTel,const char *nameGtTemp){             //GT0001
  2.         FILE *ptrGuiaTel, *ptrGtTemp;  
  3.         char c, x;
  4.  
  5.         if( !( ptrGuiaTel = fopen(nameGuiaTel, "r" ))){
  6.                 mensaje();
  7.                 exit(1);                                
  8.         }
  9.         if( !( ptrGtTemp = fopen(nameGtTemp, "w" ))){
  10.                 mensaje();
  11.                 exit(1);                                
  12.         }
  13.  
  14.         c = fgetc( ptrGuiaTel );
  15.         while ( c != EOF ){
  16.                 x = fputc( c, ptrGtTemp );
  17.                 if (x != c){
  18.                         mensaje();
  19.                         exit(1);                                
  20.                 }
  21.                 c = fgetc( ptrGuiaTel );
  22.         }
  23.  
  24.         if( ( fclose( ptrGuiaTel ) ) ){
  25.                 mensaje();
  26.                 exit(1);                                
  27.         }
  28.         if( ( fclose( ptrGtTemp ) ) ){
  29.                 mensaje();
  30.                 exit(1);                                
  31.         }
  32. }

Y obviamente lo llamas :

Código: C
  1. copiaDeSeguridad("archGuiaTel.txt","archGtTemp.txt");

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Plantilla para trabajar con archivos [C]
« Respuesta #4 en: 17 de Abril de 2017, 13:26:59 »
Hola, KILLERJC. -
Ahora lo entendí y me gustó lo que propones, solo me queda una duda, la extención de los archivos que importancias tienen, por Ej. si declaro un archivo aaa.txt y otro aaa.bak, como debo interpretarlo, el .txt es un archivo de texto y .bak es una copia de seguridad, ¿esto es solo ilustrativo o para el sistema operativo tiene alguna diferencia? -     

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 KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Plantilla para trabajar con archivos [C]
« Respuesta #5 en: 17 de Abril de 2017, 14:04:17 »
en si es para el usuario, voy a hablar de Windows mas que nada, cuando uno trabajo con archivos, la extension permite conocer y relacionar el archivo con el programa que lo abre, en Linux podes tener archivos sin extensiones, pero si el formato en que esta guardado es como el de un txt entonces no hay diferencia y lo puedo abrir con cualquier editor de texto. Si pensas abrirlo para verlo con algun editor de texto con un simple doble click, entonces procede a ponerle el ".txt", el .bak es una abreviatura y generalmente se usa para designar a los backups de algunos archivos. Si quisiera hacer un backup lo haria asi:


copiaDeSeguridad("archGuiaTel.txt","archGuiaTel.bak");

De esa forma el usuario si ve el archivo, el txt lo puede abrir con doble click, verlo y editarlo, el .bak va a tener que seleccionar el bloc de notas como aplicacion para abrirlo lo cual es un poco mas dificil que suceda (y lo haga un usuario normal - sin conocimiento). Pero una persona "experimentada" sabria que por el nombre  y por la extension es un backup del txt que lleva el mismo nombre, por lo cual sabria que puede abrirlo con un editor de texto y ver su contenido.

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Plantilla para trabajar con archivos [C]
« Respuesta #6 en: 18 de Abril de 2017, 11:46:20 »
Hola, ¿cómo están?
KILLERJC, como te mencione anteriormente me pareció interesante como proponías la función copiaDeSeguridad y lo puse en práctica, me da el siguiente error y supongo que es porque intento pasar como parámetro el nombre del archivo .bak y todavía no está declarado, no sé cómo solucionar esto, te dejo también lo que tengo en la carpeta donde está todo. -

Código: C
  1. int main( void ){
  2.         char frase[MAX];
  3.  
  4.         copiaDeSeguridad( "archGuiaTel.txt","archGuiaTel.bak" );
  5.         ingresarFrase( frase );
  6.         copiar( frase );
  7.  
  8.         return EXIT_SUCCESS;
  9.        
  10. }

Código: C
  1. void copiaDeSeguridad( const char *GtTxt, const char *GtBak ){
  2.         FILE *ptrGtTxt, *ptrGtBak;  
  3.         char c, x;
  4.      
  5.         if( !( ptrGtTxt = fopen( GtTxt, "r" ))){
  6.                 mensaje();
  7.                 exit(1);                                
  8.         }
  9.         if( !( ptrGtBak = fopen( Gtbak, "w" ))){
  10.                 mensaje();
  11.                 exit(1);                                
  12.         }
  13.      
  14.         c = fgetc( ptrGtTxt );
  15.         while ( c != EOF ){
  16.                 x = fputc( c, ptrGtBak );
  17.                 if (x != c){
  18.                         mensaje();
  19.                         exit(1);                                
  20.                 }
  21.                 c = fgetc( ptrGtTxt );
  22.         }
  23.      
  24.         if( ( fclose( ptrGtTxt ) ) ){
  25.                 mensaje();
  26.                 exit(1);                                
  27.         }
  28.         if( ( fclose( ptrGtBak ) ) ){
  29.                 mensaje();
  30.                 exit(1);                                
  31.         }
  32. }





Bueno tú me dirás si esto tiene solución y perdón por quitarte tanto tiempo, lo hago porque me interesa todo lo que pueda aprender de lis expertos. -

Un abrazo.
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 KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Plantilla para trabajar con archivos [C]
« Respuesta #7 en: 18 de Abril de 2017, 15:13:02 »
C es case sensitive, mira:

Citar
void copiaDeSeguridad( const char *GtTxt, const char *GtBak ){

Citar
        if( !( ptrGtBak = fopen( Gtbak, "w" ))){

Y el error te dice que no esta declarado el Gtbak, porque en realidad vos declaraste GtBak

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Plantilla para trabajar con archivos [C]
« Respuesta #8 en: 18 de Abril de 2017, 17:49:05 »


No tengo consuelo, mil disculpas...
Ahora tengo otra intriga, que pasara con la función errorEscritura dado que si hay algún error con fflush llamo a esta función, el caso es que los 2 archivos van a quedar con el mismo nombre y la misma extención .txt ¿ cómo debo hacer para borrar en este caso el original y preservar la copia?

Código: C
  1. void errorEscritura( void ){
  2.         if( rename( "archGuiaTel.bak","archGuiaTel.txt") !=0 ){
  3.                 mensaje();
  4.                 exit(1);
  5.         }
  6.  
  7.         if(remove( "archGuiaTel.txt") !=0 ){
  8.                 mensaje();
  9.                 exit(1);
  10.         }
  11. }

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 KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Plantilla para trabajar con archivos [C]
« Respuesta #9 en: 18 de Abril de 2017, 23:48:33 »
Primero borras el txt y luego le cambias el nombre. Aunque eso te dejaria sin el .bak y deberias generar una copia de seguridad de este ultimo.

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Plantilla para trabajar con archivos [C]
« Respuesta #10 en: 20 de Abril de 2017, 15:00:31 »
Hola, ¿cómo están?
Hice los cambios que propusiste, espero haber entendido, me falta tan solo hacer la función para imprimir los datos existentes en el archivo, esto último es relativamente sencillo. -
Pero eso no es todo, necesitaría que me digas si hay alguna manera para forzar el error de ffluss, lo que ocurre que siempre me gusta probar el programa en su totalidad, pero en este caso desconozco cómo hacerlo, no puedo saber si funcionara correctamente, otra cosa seria que tú me asegures que no va a fallar y ya. -

Código: C
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define MAX 80
  6.  
  7. void copiaDeSeguridad( const char *GtTxt, const char *GtBak );
  8. void ingresarFrase( char frase[] );
  9. void copiar( char frase[] );
  10. void errorEscritura( void );
  11. void mensaje( void );
  12.  
  13. int main( void ){
  14.         char frase[MAX];
  15.  
  16.         copiaDeSeguridad( "archGuiaTel.txt","archGuiaTel.bak" );
  17.         ingresarFrase( frase );
  18.         copiar( frase );
  19.  
  20.         return EXIT_SUCCESS;
  21.        
  22. }
  23.  
  24. void copiaDeSeguridad( const char *GtTxt, const char *GtBak ){
  25.         FILE *ptrGtTxt, *ptrGtBak;  
  26.         char c, x;
  27.  
  28.         if( !( ptrGtTxt = fopen( GtTxt, "r" ))){
  29.                 mensaje();
  30.                 exit(1);                                
  31.         }
  32.         if( !( ptrGtBak = fopen( GtBak, "w" ))){
  33.                 mensaje();
  34.                 exit(1);                                
  35.         }
  36.      
  37.         c = fgetc( ptrGtTxt );
  38.         while ( c != EOF ){
  39.                 x = fputc( c, ptrGtBak );
  40.                 if (x != c){
  41.                         mensaje();
  42.                         exit(1);                                
  43.                 }
  44.                 c = fgetc( ptrGtTxt );
  45.         }
  46.      
  47.         if( ( fclose( ptrGtTxt ) ) ){
  48.                 mensaje();
  49.                 exit(1);                                
  50.         }
  51.         if( ( fclose( ptrGtBak ) ) ){
  52.                 mensaje();
  53.                 exit(1);                                
  54.         }
  55. }
  56.  
  57. void ingresarFrase( char frase[] ){
  58.         int ok=0;
  59.  
  60.         do{
  61.                 printf( "\n Ingrese frase.....:" );
  62.                 fgets( frase, MAX, stdin );
  63.                 ok = strlen( frase );
  64.         }while( ok <= 1 );
  65. }
  66.        
  67. void copiar( char frase[] ){
  68.         FILE *ptrGtTxt;
  69.  
  70.         if( !(ptrGtTxt = fopen( "archGuiaTel.txt", "a" ))){
  71.                 mensaje();
  72.                 exit(1);
  73.     }
  74.  
  75.         fprintf( ptrGtTxt, "%s", frase );
  76.  
  77.         if( fflush( ptrGtTxt ) != 0){
  78.                 mensaje();
  79.                 fclose( ptrGtTxt );
  80.                 errorEscritura( );
  81.                 exit(1);
  82.         }
  83.  
  84.         if( ( fclose( ptrGtTxt ) ) ){
  85.                 mensaje();
  86.                 exit(1);
  87.         }
  88. }
  89.  
  90. void errorEscritura( void ){
  91.         if(remove( "archGuiaTel.txt" ) !=0 ){
  92.                 mensaje();
  93.                 exit(1);
  94.         }
  95.  
  96.         if( rename( "archGuiaTel.bak","archGuiaTel.txt") !=0 ){
  97.                 mensaje();
  98.                 exit(1);
  99.         }
  100.         copiaDeSeguridad( "archGuiaTel.txt","archGuiaTel.bak" );
  101. }
  102.  
  103. void mensaje( void ){
  104.         int ch, a;
  105.  
  106.         printf( "\n Ha ocurrido un error y el programa finaliza sin cambios en el archivo." );
  107.         printf( "\n Pulse una tecla para continuar..."); a = getchar();
  108.     if( a != '\n') while ((ch = getchar()) != EOF && ch != '\n');
  109.  }
Es todo, 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 KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Plantilla para trabajar con archivos [C]
« Respuesta #11 en: 20 de Abril de 2017, 15:36:48 »
Citar
Pero eso no es todo, necesitaría que me digas si hay alguna manera para forzar el error de ffluss, lo que ocurre que siempre me gusta probar el programa en su totalidad, pero en este caso desconozco cómo hacerlo, no puedo saber si funcionara correctamente, otra cosa seria que tú me asegures que no va a fallar y ya. -

Para saber como forzarlo a que actue, deberias ver los errores que puede dar, que son EBADF y los de write:

Citar
       EAGAIN The file descriptor fd refers to a file other than a socket
              and has been marked nonblocking (O_NONBLOCK), and the write
              would block.  See open(2) for further details on the
              O_NONBLOCK flag.

       EAGAIN or EWOULDBLOCK
              The file descriptor fd refers to a socket and has been marked
              nonblocking (O_NONBLOCK), and the write would block.
              POSIX.1-2001 allows either error to be returned for this case,
              and does not require these constants to have the same value,
              so a portable application should check for both possibilities.

       EBADF  fd is not a valid file descriptor or is not open for writing.

       EDESTADDRREQ
              fd refers to a datagram socket for which a peer address has
              not been set using connect(2).

       EDQUOT The user's quota of disk blocks on the filesystem containing
              the file referred to by fd has been exhausted.

       EFAULT buf is outside your accessible address space.

       EFBIG  An attempt was made to write a file that exceeds the
              implementation-defined maximum file size or the process's file
              size limit, or to write at a position past the maximum allowed
              offset.

       EINTR  The call was interrupted by a signal before any data was
              written; see signal(7).

       EINVAL fd is attached to an object which is unsuitable for writing;
              or the file was opened with the O_DIRECT flag, and either the
              address specified in buf, the value specified in count, or the
              file offset is not suitably aligned.

       EIO    A low-level I/O error occurred while modifying the inode.

       ENOSPC The device containing the file referred to by fd has no room
              for the data.

       EPERM  The operation was prevented by a file seal; see fcntl(2).

       EPIPE  fd is connected to a pipe or socket whose reading end is
              closed.  When this happens the writing process will also
              receive a SIGPIPE signal.  (Thus, the write return value is
              seen only if the program catches, blocks or ignores this
              signal.)

El mas simple de probar es el EBADF, en la cual el puntero que se le pasa tiene que poder escribirse y ser valido. Por lo tanto si lo abris como lectura deberias tener el error, si lo cerras antes de usar fflush tambien te deberia dar el error.


 

anything