Autor Tema: Problema con feof y fgets  (Leído 1088 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Conectado warrior_rockk

  • Full Member
  • ***
  • Mensajes: 227
  • Karma: 8
    • Ver Perfil
Problema con feof y fgets
« en: Agosto 21, 2015, 03: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:
Código: [Seleccionar]
_file = fopen("game-en.lng",O_READ);
while(!feof(_file))
linea = fgets(_file);
end;

Conectado Erkosone

  • Hero Member
  • *****
  • Mensajes: 882
  • Karma: 51
    • Ver Perfil
Re:Problema con feof y fgets
« Respuesta #1 en: Agosto 22, 2015, 06:15:07 am »
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 ;)

Desconectado emov2k4

  • Full Member
  • ***
  • Mensajes: 224
  • Karma: 4
  • Sexo: Masculino
    • Ver Perfil
Re:Problema con feof y fgets
« Respuesta #2 en: Agosto 23, 2015, 09:34:13 am »
Tuve el mismo problema, pixel me ayudo...

Citar
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);


Conectado warrior_rockk

  • Full Member
  • ***
  • Mensajes: 227
  • Karma: 8
    • Ver Perfil
Re:Problema con feof y fgets
« Respuesta #3 en: Agosto 23, 2015, 11:33:09 am »
Me vale.
Muchas gracias a los dos