Ver Mensaje Individual
  #6 (permalink)  
Antiguo 09/12/2015, 07:34
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Programa del reves C

Es muy importante saber cómo funciona cada función... te lo demuestro en dos minutos:

Código C:
Ver original
  1. while (!feof(f))
  2. {
  3.   fgets(texto,MAX_BUFFER,f);

el flag EOF no se activa hasta que no se produce una lectura errónea. Lo que te está sucediendo es que, una vez has leído la última línea, feof sigue devolviendo 1 porque, técnicamente, no has llegado al final del fichero. Después lanzas una nueva lectura... lectura que va a fallar y va a activar el flag EOF... pero no lo estás comprobando sino que te lanzas a invertir la línea... como la lectura ha fallado, fgets no ha modificado el contenido de texto, por lo que sigue almacenando la última línea de tu fichero.

¿Posibles soluciones? Puedes comprobar feof después de lanzar la lectura:

Código C:
Ver original
  1. while(1)
  2. {
  3.   fgets(texto,MAX_BUFFER,f)
  4.   if( feof(f) )
  5.     break;
  6.  
  7.   // ...
  8. }

Otra opción es comprobar el valor de retorno de fgets. Si la lectura es correcta te devuelve la cadena leída y, si no, un puntero nulo:

Código C:
Ver original
  1. while(!feof(f))
  2. {
  3.   // equivalente a if( fgets(texto,MAX_BUFFER,f) != 0 )
  4.   if( fgets(texto,MAX_BUFFER,f) )
  5.   {
  6.     // ...
  7.   }
  8. }

En este caso comprobarías el flag EOF... como aun no has hecho una lectura incorrecta sigues dentro del bucle. A continuación lanzas una lectura que va a fallar... lo detectas y no haces absolutamente nada, dejas que el bucle intente repetirse... al volver a evaluarse EOF sales del bucle y evitas mostrar dos veces la última línea.

Un saludo
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.