Bennu Game Development

Foros en Español => Plataformas => Android => Topic started by: warrior_rockk on August 21, 2015, 11:45:13 AM

Title: Problema con feof y fgets
Post by: warrior_rockk on August 21, 2015, 11:45:13 AM
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;
Title: Re:Problema con feof y fgets
Post by: Erkosone on August 22, 2015, 02:15:07 PM
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 ;)
Title: Re:Problema con feof y fgets
Post by: emov2k4 on August 23, 2015, 05:34:13 PM
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);

Title: Re:Problema con feof y fgets
Post by: warrior_rockk on August 23, 2015, 07:33:09 PM
Me vale.
Muchas gracias a los dos