No Logro Detectar El Fin De Archivo


Objetivo: No Logro Detectar El Fin De Archivo
Hola amigos!
Estoy intentando leer un archivo byte a byte. A modo de experimentar sin tener conflictos con otros controles o "cosas raras", tengo un Form con un solo botón, en el que he escrito el siguiente código:

Código: [Descargar] [Ocultar]
  1.  
  2. ' gambas class file
  3.  
  4. PUBLIC SUB _new()
  5.  
  6. END
  7.  
  8. PUBLIC SUB Form_Open()
  9.  
  10. END
  11.  
  12. PUBLIC SUB btn_Abrir_fichero_ROM_Click()
  13. DIM ROM_file AS file
  14. DIM puntero AS Integer
  15. DIM byte_leido AS Byte

  16. puntero = 0

  17. Dialog.Title = "Seleccione ROM a abrir."
  18. Dialog.Filter = ["*.rom", "Ficheros ROM", "*.rom", "Ficheros ROM", "*", "Todos los archivos"]
  19. Dialog.Path = User.Home

  20. IF Dialog.OpenFile() THEN
  21. RETURN 'Salió con cancelar...aborto.
  22. ENDIF

  23. ROM_file = OPEN Dialog.Path FOR INPUT

  24. WHILE TRUE
  25. puntero = puntero + 1
  26. SEEK #ROM_file, puntero 'Nos colocamos en el byte a leer

  27. IF ROM_file.EndOfFile THEN BREAK

  28. READ #ROM_file, byte_leido 'Leer byte
  29. WEND

  30. ROM_file.Close
  31. END
  32.  


Sin embargo, y a pesar de que he comprobado que lee realmnete el archivo, siempre termino con un error debido a que se "pasa" del fin de archivo. El problema evidentemente reside en la linea

IF ROM_file.EndOfFile THEN BREAK


¿Como debería hacer para que el bucle solo lea el contenido del fichero, sin intentar avanzar más allá del final del mismo?

Perfil MP  
Objetivo: Re: No Logro Detectar El Fin De Archivo
Hola
Hay un documento explicando como se trabaja con archivos binarios.
Ficheros binarios en gambas

La idea básica para recorrer un archivo de este tipo de principio a fin es
Dim F as file 'declarar el manejador
' Dim Dato as byte ' si quieres leerlo como byres
' Dim Dato as string 'si quieres leerlo como string de un caracter

'normalmente esto no se pone porque lo normal es que en binario se escriban las cosas en littleEndian pero se da el caso de que si el archivo a leer es bigendian (como ocurre con los png por ejemplo) hay que poner lo siguiente:
F.byteorder=gb.bigendian

Y ahora recorrer el archivo leyendo un byte cada vez. Si lees strings en vez de 1 podrías poner read #F,Dato,8 para leer los bytes de ocho en ocho por ejemplo ...

do while not eof(f) mientras no sea fin de fichero
' read #F, dato 'si lees bytes
' read #F, dato, 1 'si quieres leer un string de un byte
loop
close(f)


En el ejemplo que utilizo en este documento lo que hago es leer un fichero png para obtener algún dato de esa imagen (por ejemplo su tamaño o lo que sea)

Un saludo

última edición por soplo el Lunes, 04 Octobre 2010, 18:06; editado 1 vez
Perfil MP  
Objetivo: Re: No Logro Detectar El Fin De Archivo
Mil gracias!

como siempre, funcionó a la primera

Y muy bueno el articulo! No conocía esa sección del sitio.

Perfil MP  
Objetivo: Re: No Logro Detectar El Fin De Archivo
Hola Soplo!
Voy a abusar de tu buena voluntad y preguntarte algo mas:

Estoy leyendo el contenido de un fichero, byte a byte, y volcandolos dentro de un grid. El grid tiene 8 columnas, y voy llenandoló fila a fila con los bytes leidos.

Los archivos nunca son mayores a 64KB. En general, son bastante más chicos. Y acá viene la pregunta:

¿Hay alguna forma de evitar el "desperdicio" que significa crear un grid de 8192 filas si es que no siempre las voy a necesitar?

Obviamente, podría primero abrir el fichero, recorrerlo para ver cual es su longitud, y luego recién dimensionar el grid, pero seguramente hay alguna forma mas "elegante" de hacerlo. Por ejemplo, alguna funcion que devuelva el tamaño total del archivo

¿Podes darme alguna pista sobre esto?

Gracias!

Perfil MP  
Objetivo: Re: No Logro Detectar El Fin De Archivo
Hola
Citar:
¿Hay alguna forma de evitar el "desperdicio" que significa crear un grid de 8192 filas si es que no siempre las voy a necesitar?


La forma mas simple que se me ocurre es obtener el tamaño del fichero. Eso te da el número de celdas que necesitas.
dim F as file, CantidadDeCeldas as long
open fichero for read as #F

CantidadDeCeldas=lof(F)


' Si por ejemplo quieres 8 columnas en tu grid entonces la cantidad de filas será CantidadDeCeltas/8+1 (por el encabezamiento)

Un saludo

última edición por soplo el Martes, 05 Octobre 2010, 14:25; editado 1 vez
Perfil MP  
Objetivo: Re: No Logro Detectar El Fin De Archivo
No conocia la funcion lof().

Es exactamente lo que necesito. GRACIAS!

Perfil MP  

Página 1 de 1


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.4556s (PHP: -73% SQL: 173%)
Consultas SQL: 47 - Debug off - GZIP Activado