Foros del Web » Programación para mayores de 30 ;) » C/C++ »

El bucle while con ¡feof me duplica el último registro [C]

Estas en el tema de El bucle while con ¡feof me duplica el último registro [C] en el foro de C/C++ en Foros del Web. Hola. Tengo un inconveniente con el bucle while y es que al imprimir el archivo me duplica el último registro, encontré este mismo inconveniente posteado ...
  #1 (permalink)  
Antiguo 24/03/2015, 12:14
rdv316
Invitado
 
Mensajes: n/a
Puntos:
El bucle while con ¡feof me duplica el último registro [C]

Hola.
Tengo un inconveniente con el bucle while y es que al imprimir el archivo me duplica el último registro, encontré este mismo inconveniente posteado en distintos foros pero ningún ej. me dio resultado.-
¿Me podrían decir cómo puedo hacer para solucionarlo?.-

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. struct registro{
  5.     char marcado;
  6.     char ingles[30];
  7.     char espaniol[30];
  8. }est;
  9.  
  10. int main(void){
  11.     printf("\n ingl%cs.......: ", 130);
  12.     gets(est.ingles);
  13.  
  14.     printf("\n traducci%cn...: ", 162);
  15.     gets(est.espaniol);
  16.  
  17.     FILE * ptr;
  18.  
  19.     if( ( ptr=fopen("archivo.txt","a+") ) == NULL ){
  20.         printf("\n No se pudo abrir el archivo...");   
  21.     }
  22.     else{
  23.         fwrite(&est,sizeof(est),1,ptr);
  24.         est.marcado = '*';
  25.    
  26.         rewind(ptr);
  27.  
  28.         printf("\n  Borrado   Ingl%cs       Espa%col", 130, 164);  
  29.         while(!feof(ptr)){
  30.             fread(&est,sizeof(est),1,ptr);
  31.             printf("\n %8d %8s %13s", est.marcado ,est.ingles, est.espaniol);  
  32.         }
  33.  
  34.         fclose(ptr);       
  35.     }
  36.  
  37.     return 0;
  38. }

Saludos.
Daniel

Última edición por rdv316; 24/03/2015 a las 12:17 Razón: Si pongo el código no me da de alta el post, tengo que enviarlo sin el código y luego editarlo para insertarle el programa.-
  #2 (permalink)  
Antiguo 24/03/2015, 12:18
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: El bucle while con ¡feof me duplica el último registro [C]

Tienes un error en la linea 13! (Solo bromeo, no puedo ver tu código).
  #3 (permalink)  
Antiguo 24/03/2015, 14:57
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: El bucle while con ¡feof me duplica el último registro [C]

fread retorna el numero de elementos leidos, simplemente comprueba que fread retorne el numero de elementos que quieres leer, en este caso 1, y si no retorna ese valor es porque huvo algun error o porque llegó al oef por lo que no imprimes y listo. Otra cosa, usa ferror() dentro del bucle por si hay algun error salir de el tambien.
  #4 (permalink)  
Antiguo 24/03/2015, 15:24
rdv316
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: El bucle while con ¡feof me duplica el último registro [C]

Hola aguml.-
Gracias, con esta sintaxis me funciona correctamente.-

Código C:
Ver original
  1. ...........
  2. while (fread(&est, sizeof est, 1, ptr) == 1){
  3.     printf("\n %8d %8s %13s", est.marcado ,est.ingles, est.espaniol);  
  4. }
  5. ...........

Saludos.
Daniel
  #5 (permalink)  
Antiguo 24/03/2015, 15:50
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: El bucle while con ¡feof me duplica el último registro [C]

El error de tu programa consiste en los siguientes errores:
Imaginas que se han leído todas las estructuras y estas en la ultima aun por leer, fread lee esa ultima estructura(Todo correcto nada falla), printf la imprime. El amiguete feof() no ve ningún problema ya que la ultima lectura ha sido correcta, el bucle se repite una vez más(No debería, ya imprimimos la ultima estructura guardada.), entonces esta vez si que falla la lectura con fread ya que no hay nada mas que leer, no se guarda nada en la estructura( Eso porque fallo fread.), pero recuerde que la estructura aun conserva lo ultimo guardado anteriormente, feof() ahora si va hacer de chivato a causa de fread haber fallado pero no sin antes el printf haber imprimido una vez más.

Como vemos el programa hace lo que se pide, el problema es que feof solo va dar error después de que fread haya fallado, pero como imprimimos una vez más antes de salir sale malo ya que se imprime 2 veces lo ultimo.

Mejor usar los valores de retorno que te proporcionan las funciones que usas para leer desde los archivos para que eso no pase. Además de usar ferror y feof pero a modo de comprobación solamente.

Suerte
  #6 (permalink)  
Antiguo 25/03/2015, 08:18
rdv316
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: El bucle while con ¡feof me duplica el último registro [C]

Hola vangodp, creme que lo pusiste en tu post lo voy a colgar de un cuadro, que interesante (por lo menos para mí) cuando encuentro este tipo de documentación, mira que antes de dar de alta el post leí en mi libro y en la web y creme que no encontré una documentación parecida a lo tuyo, ni parecida.-

Saludos.
Daniel
  #7 (permalink)  
Antiguo 25/03/2015, 11:00
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: El bucle while con ¡feof me duplica el último registro [C]

La verdad es que en muchos sitios te enseñan a usar el feof y no es que este mal, lo malo es que pensamos que para todo va servir y no es así.
Lo mejor es casi siempre usar los valores de retorno de las funciones como bien comenta aguml.
Créame si te digo que fue hace poco que me entere del mismo XD
Aquí puedes leer algo al respecto, también ver ejemplos de como usar algunas funciones para leer archivos de una forma más eficaz en C/C++: http://stackoverflow.com/questions/5...s-always-wrong

No me recuerdo quien me paso el enlace este, pero fue en este mismo foro no hace mucho.

Bueno.. Espero que te sirva.

Etiquetas: bucle, registro
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:38.