Fecha actual Mar Jul 01, 2025 2:20 pm

Todos los horarios son UTC + 1 hora [ DST ]




Nuevo tema Responder al tema  [ 14 mensajes ] 
Autor Mensaje
 Asunto: FRead()
NotaPublicado: Mié Mar 28, 2007 12:09 am 

Registrado: Dom Feb 12, 2006 3:28 pm
Mensajes: 54
Hola a todos, necesito abrir un archivo para lectura y escritura en modo binario y no puedo hacerlo. El código es...

hInputFile := FOpen((cFilePath + cFileName + cFileExt), (2 + 16))
nBytesRead := FRead(hInputFile, @cBuffer, nBlockRead)

Da igual si la apertura del archivo es 0+0, 0+16, 2+0 ó 2+16 (modo lectura+compartido), o si nBlockRead es 1 ó mayor que 1 (cBuffer es una cadena de caracteres ajustada al tamaño de nBlockRead), me falla en todos.

¿Cómo lo puedo hacer?

Gracias.


Arriba
 Perfil  
Responder citando  
 Asunto:
NotaPublicado: Mié Mar 28, 2007 11:35 am 
Avatar de Usuario

Registrado: Mar Oct 11, 2005 6:58 pm
Mensajes: 138
Ubicación: España
Hola eb4bgr;
Veas si te sirve este ejemplo.

Un saludo
Fraguibo


Adjuntos:
Funcion FREA().pdf [110.37 KiB]
506 veces
Arriba
 Perfil  
Responder citando  
 Asunto: No funciona
NotaPublicado: Mié Mar 28, 2007 10:19 pm 

Registrado: Dom Feb 12, 2006 3:28 pm
Mensajes: 54
Franguibo, muchas gracias por tu ayuda pero no me funciona. Con tu código, en C3 v2, me sale el mismo error: error no recuperable 999 (999=intento de ejecutar código no válido, según documentación de Clipper).

¿Alguna sugerencia?


Arriba
 Perfil  
Responder citando  
 Asunto:
NotaPublicado: Jue Mar 29, 2007 7:37 am 
Site Admin
Avatar de Usuario

Registrado: Jue Oct 06, 2005 10:49 pm
Mensajes: 655
Ubicación: España - Salamanca
Manda un ejemplo que veamos lo que haces.

_________________
Un saludo,
Bruno Cantero
www.c3compiler.com


Arriba
 Perfil  
Responder citando  
 Asunto: Re:
NotaPublicado: Jue Mar 29, 2007 12:44 pm 

Registrado: Dom Feb 12, 2006 3:28 pm
Mensajes: 54
Bruno, el código no tiene nada de especial y los valores de cada variable se comprueban antes de ejecutar el código. Es una rutina para leer los primeros #x bytes de un archivo, y dependiendo de lo que lea irá a una parte del programa o a otra, pero lo que falla es la apertura del archivo o su lectura. Ese mismo código funciona en Clipper 5.3

Para prevenir un posible fallo del compilador por si FRead() tiene funciones compartidas con los campos memo del driver dbfntx (que falla en ellos), no uso este driver; sólamente uso el driver dbfcdx+edbfcdx. El archivo se cierra al entrar en la función con FClose() para prevenir que ya pueda estar abierto, y si no está abierto FClose() cierra, sin generar error, una variable con el valor (-1). Pero también he probado a anular FClose() y abrir directamente el archivo y no funciona.


Arriba
 Perfil  
Responder citando  
 Asunto:
NotaPublicado: Jue Mar 29, 2007 6:02 pm 
Site Admin
Avatar de Usuario

Registrado: Jue Oct 06, 2005 10:49 pm
Mensajes: 655
Ubicación: España - Salamanca
Alejandro,

Citar:
Bruno, el código no tiene nada de especial y los valores de cada variable se comprueban antes de ejecutar el código. Es una rutina para leer los primeros #x bytes de un archivo, y dependiendo de lo que lea irá a una parte del programa o a otra, pero lo que falla es la apertura del archivo o su lectura. Ese mismo código funciona en Clipper 5.3

Lo que para unos es código normal para otros puede no ser tan normal, si tu crees que lo que haces está bien pues adelante, si te falla algo a lo mejor hay algo que no está tan bien como te parece, prueba el ejemplo Blobs, hace uso de la función FOpen y FRead.

_________________
Un saludo,
Bruno Cantero
www.c3compiler.com


Arriba
 Perfil  
Responder citando  
NotaPublicado: Vie Mar 30, 2007 8:21 pm 
Avatar de Usuario

Registrado: Mar Oct 11, 2005 6:58 pm
Mensajes: 138
Ubicación: España
Hola de nuevo eb4bgr;

Despues de repasar las funciones FOpen() y Fread(), junto con el ejemplo Blobs, he llegado a confeccionar este metodo, pruebalo haber si es lo que estas buscando.

Method ExtraerBites() Class xxxx

Local aPun, aVar, aBit, aLee, aTot
// Abrimos y leemos el fichero.
aPun := Fopen( ‘Fichero’, FO_READ )
// Comprobamos el tamaño del fichero leído.
If aPun >= 0
aVar := Space( 4096 )
aBit := ‘’
aLee := FRead( aPun, @aVar, aVar )
aTot := aLee
// Si el Tamaño del fichero es mayor que aVar.
Do While aLee >0
aBit += Left( aVar, aLee )
aLee := FRead( aPun @aVar, aVar )
aTot += aLee
Enddo
Endif
FClose( aPun )

Return NIL

Ya me comentaras si te ha servido

Fraguibo


Arriba
 Perfil  
Responder citando  
 Asunto: Re:
NotaPublicado: Sab Mar 31, 2007 6:00 pm 

Registrado: Dom Feb 12, 2006 3:28 pm
Mensajes: 54
Gracias Franguibo, de momento estoy rehaciendo todo el proyecto desde cero, a ver si de paso también encuentro lo que me falla en la clase TRegEdit(). He hecho algunas pruebas modificando el proyecto de los BLObs y sigue funcionando, por lo que ya he descartado que fuera la peor de mis pesadillas. Con el tiempo lo encontraré.

Un saludo.


Arriba
 Perfil  
Responder citando  
NotaPublicado: Dom Abr 01, 2007 12:39 pm 

Registrado: Dom Feb 12, 2006 3:28 pm
Mensajes: 54
Franguibo, muchas gracias por tu ejemplo pero sigue sin funcionar. Ya he rastreado el error y es un fallo de C3. Por cierto, curioso uso el que le das a FRead(), aunque a mí no me ha leído nada. Bien, aquí está el error...

local aPun, aVar, aBit, aLee, aTot // FUNCIONA
private aPun, aVar, aBit, aLee, aTot // FALLA
public aPun, aVar, aBit, aLee, aTot // FALLA

// Abrimos y leemos el fichero.
aPun := Fopen( "prueba.txt", 0 )
// Comprobamos el tamaño del fichero leído.
If aPun >= 0
aVar := Space( 4096 )
aBit := ""
aLee := FRead( aPun, @aVar, aVar )
aTot := aLee
// Si el Tamaño del fichero es mayor que aVar.
Do While aLee >0
aBit += Left( aVar, aLee )
aLee := FRead( aPun, @aVar, aVar )
aTot += aLee
Enddo
Endif
FClose( aPun )


Arriba
 Perfil  
Responder citando  
NotaPublicado: Dom Abr 01, 2007 7:21 pm 
Avatar de Usuario

Registrado: Mar Oct 11, 2005 6:58 pm
Mensajes: 138
Ubicación: España
Hola de Nuevo eb4bgr:

De lo que me dices que es muy curioso la forma en que utilizo la función Fread(), pues si consultas las forma de trabajo de esta función, veras que esta es la mejor forma de utilizarla, sin exponerte a que el programa te de ERROR, aqui te adjunto un trozo de su documentación:

"Es muy Importante y Fundamental, el comprobar de antemano que la Variable, es lo suficiente grande, como para poder contener todos los Bites Leídos, ya que si la Variable es más pequeña, de lo necesario el Programa Falla.

Este es el error más común, que cometen los Programadores, cuando se utilizan funciones, de Entrada/salida de Bajo Nivel, por lo que el Método recomendado, con los resultados mas fiables y garantizados, es el utilizar la Longitud de la Variable de Memoria, como el Valor del Tercer Parámetro."

Todo esto y mucho más esta reflejado en el nuevo tutorial que estoy confeccionando para C3 y su IDE.

Bueno recibe un saludo.

Fraguibo


Arriba
 Perfil  
Responder citando  
 Asunto: Re:
NotaPublicado: Lun Abr 02, 2007 12:05 pm 

Registrado: Dom Feb 12, 2006 3:28 pm
Mensajes: 54
Hola Franguibo, lo del tamaño de las variables siempre lo he tenido en cuenta. Te lo decía por...

aLee := FRead( aPun, @aVar, aVar )

El último parámetro es numérico y le estás asignando una cadena de caracteres, pero al probar tu código no salió ningún error run-time.

Un saludo.


Arriba
 Perfil  
Responder citando  
 Asunto: Re:
NotaPublicado: Lun Abr 02, 2007 5:31 pm 
Avatar de Usuario

Registrado: Dom Oct 09, 2005 11:26 am
Mensajes: 362
Ubicación: Salamanca - España
eb4bgr escribió:
Hola Franguibo, lo del tamaño de las variables siempre lo he tenido en cuenta. Te lo decía por...

aLee := FRead( aPun, @aVar, aVar )

El último parámetro es numérico y le estás asignando una cadena de caracteres, pero al probar tu código no salió ningún error run-time.

Un saludo.


Estoy de acuedro con eb4bgr, ya que la documentación dice:

Syntax

FREAD(<nHandle>, @<cBufferVar>, <nBytes>) --> nBytes

Arguments

<nHandle> is the file handle obtained from FOPEN(), FCREATE(), or
predefined by DOS.

<cBufferVar> is the name of an existing and initialized character
variable used to store data read from the specified file. The length of
this variable must be greater than or equal to <nBytes>. <cBufferVar>
must be passed by reference and, therefore, must be prefaced by the pass-
by-reference operator (@).

<nBytes> is the number of bytes to read into the buffer.

... por lo que la sintaxis de Fragibo no la comparto.

_________________
Un saludo.
Jesús P. Melgar Velasco


Arriba
 Perfil  
Responder citando  
NotaPublicado: Mar Abr 03, 2007 6:16 pm 
Avatar de Usuario

Registrado: Mar Oct 11, 2005 6:58 pm
Mensajes: 138
Ubicación: España
Hola eb4bgr y Jesús:

Los dos teneis razón el uno de extrañarse y el otro de no compartir mi opinión, por que segun la ducumentación, real de esta Función, deberia de habertela escrito así:

aLeido := FRead( aPuntero, @cVarBuff, Len( cVarBuff ))

Aqui os lo expongo reflejado, tal como viene en la documentación, de que dispongo yo:

aPuntero := Space( 4096 ) .
cVarBuff := FOpen( “Fichero”, FO_READ )
FRead( aPuntero, @cVarBuff, Len( cVarBuff ))

Así esta función devuelve, el Numero de Bites que realmente a Leído y sí si la lectura es Correcta, su valor será igual al Tercer Parametro.

Un saludo.
Fraguibo


Arriba
 Perfil  
Responder citando  
 Asunto: Re:
NotaPublicado: Mar Abr 03, 2007 8:59 pm 

Registrado: Dom Feb 12, 2006 3:28 pm
Mensajes: 54
Franguibo, no pasa nada, sólo te lo comenté porque me había llamado la atención tu código y al probarlo no me funcionaba. De hecho, ni si quiera esperaba tu respuesta a ese comentario. A pesar de saber que la sintáxis no era correcta, fuí yo quien decidió probar tu código para ver si funcionaba y era una característica no documentada de FRead().

El problema está solucionado y la parte correspondiente del código fuente del proyecto terminada.

Gracias a todos.


Arriba
 Perfil  
Responder citando  
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 14 mensajes ] 

Todos los horarios son UTC + 1 hora [ DST ]


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Buscar:
Saltar a:  
cron