No Logro Detectar El Fin De Archivo


Subject: 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?

Profile PM  
Subject: 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

Last edited by soplo on Monday, 04 October 2010, 18:06; edited 1 time in total
Profile PM  
Subject: 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.

Profile PM  
Subject: 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!

Profile PM  
Subject: 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

Last edited by soplo on Tuesday, 05 October 2010, 14:25; edited 1 time in total
Profile PM  
Subject: Re: No Logro Detectar El Fin De Archivo
No conocia la funcion lof().

Es exactamente lo que necesito. GRACIAS!

Profile PM  

Page 1 of 1


  
You cannot post new topics
You cannot reply to topics
You cannot edit your posts
You cannot delete your posts
You cannot vote in polls
You cannot attach files
You can download files
You cannot post calendar events

   

This is a "Lo-Fi" version of our main content. To view the full version with more information, formatting and images, please click here.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Generation Time: 0.1786s (PHP: -36% SQL: 136%)
SQL queries: 24 - Debug Off - GZIP Enabled