Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
No Logro Detectar El Fin De Archivo
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje 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.     
      
  17.     puntero = 0
      
  18.     
      
  19.     Dialog.Title = "Seleccione ROM a abrir."
      
  20.     Dialog.Filter = ["*.rom", "Ficheros ROM", "*.rom", "Ficheros ROM", "*", "Todos los archivos"]
      
  21.     Dialog.Path = User.Home
      
  22.     
      
  23.     IF Dialog.OpenFile() THEN
      
  24.       RETURN 'Salió con cancelar...aborto.
      
  25.     ENDIF    
      
  26.     
      
  27.     ROM_file = OPEN Dialog.Path FOR INPUT
      
  28.     
      
  29.     WHILE TRUE
      
  30.         puntero = puntero + 1
      
  31.         SEEK #ROM_file, puntero    'Nos colocamos en el byte a leer
      
  32.         
      
  33.         IF ROM_file.EndOfFile THEN BREAK
      
  34.         
      
  35.         READ #ROM_file, byte_leido 'Leer byte
      
  36.    WEND
      
  37.         
      
  38.    ROM_file.Close
      
  39. END
      
  40.  


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?
 



 
ariel - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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, 19:06; editado 1 vez 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.  
 



 
ariel - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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!
 



 
ariel - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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, 15:25; editado 1 vez 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: No Logro Detectar El Fin De Archivo 
 
No conocia la funcion lof().  

Es exactamente lo que necesito. GRACIAS!
 



 
ariel - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
Ocultar¡Este tema fue útil?

 

Elegir valoración:                       

Media de valoración Valoración mínima Valoración máxima Número de valoraciones
0.00 0 0 0
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
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
No puede descargar archivos
No puede publicar eventos en el calendario