Problema con feof y fgets

Started by warrior_rockk, August 21, 2015, 11:45:13 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

warrior_rockk

He estado realizando pruebas de lectura de archivo de texto y me he encontrado con que, en Android, la función feof nunca devuelve final de archivo y la función fgets, al encontrar cadena vacía deja la aplicación colgada. Como ya he tenido experiencia en otros lenguajes con los temas de codificación de carácteres y retornos de carro, expongo la lista de todo lo que he probado:


-he probado con retornos de carro en formato Windows (CR+LF) y en fomato Unix (LF)
-he probado que la ultima linea de texto tenga retorno y sin ella
-he probado que el archivo tenga codificación ANSI y UTF-8


En todos los casos y combinaciones de ellos, lee todas las lineas pero al llegar a la última, el feof no devuelve fin de linea y al intentar leer una linea inexistente con fgets, se cuelga irremediablemente. En Windows funciona correctamente.


Este sería el loop de lectura:

_file = fopen("game-en.lng",O_READ);
while(!feof(_file))
linea = fgets(_file);
end;

Erkosone

Puedes usar una etiqueta  para detectar cual es la ultima linea legible, te lo comento para que puedas salir del paso por ahora no para que lo hagas así siempre, aunque no es una mala costumbre ya que muchos tipos de archivos como los XML etc etc funcionan con cientos de etiquetas de un modo similar para indicar que se abre un bloque, que se termina un bloque etc etc..


Yo suelo leer una linea del archivo y uso la potente función split() para trocear la linea, entonces miro si la linea contiene una palabra concreta como por ejemplo yo suelo usar esta #@#END#@#, si lees eso en una linea sabes que la siguiente es la ultima de verdad y para que no pete no la lees.


Osea, lee hasta la penultima linea usando una palabra concreta que te indique que el archivo ha terminado en ese punto ;)

emov2k4

Tuve el mismo problema, pixel me ayudo...

Quote
FGETS se cuelga al llegar a la última línea de un fichero. Para evitar este problema, lo que yo hago es crear una línea que contenga EOF, y al llegar a ella dejar de leer y cerrar el fichero.


fp=fopen(...);
linea=fgets(fp);
while(!feof(fp))
if(linea=="EOF") break; end
...
end
fclose(fp);


warrior_rockk

Me vale.
Muchas gracias a los dos