Lo que te pasó es lo siguiente:
Al leer el fichero, cuando lees la última línea, aún no ha leído la marca de final de fichero. Cuando intentas leer de nuevo, entonces es cuando te detecta el final del archivo, pero te devuelve como leído la última lectura "buena" que hizo. Por eso, en tu salida te aparece repetida la última línea. Si la solución que aplicaste funciona, perfecto, pero quizás sea más fácil así:
Código C++:
Ver originalwhile (!leer.eof()) //Verifico si hay algo para leer
{
leer >> valor; //leo cada linea
if (leer.eof()) // Compruebo si he leido la marca de final de fichero
break; // Si es así, finalizo el bucle de lectura
// AQUI CONTINÚO EL PROCESADO DE LOS DATOS DEL FICHERO...
...
}