Page 1 of 1
feof()???
Posted: Mon Dec 11, 2006 1:17 pm
by Elias Torres
Hola a todos...
Alguien sabe si se puede usar la función feof()??. Si es así que cabecera hay que incluir, porque a mi no me lo está cogiendo....
Saludos..
Elías Torres.
Posted: Mon Dec 11, 2006 11:25 pm
by Antonio Linares
Elías,
Es una función de FoxPro ? Que indica final de un fichero binario ó de texto ?
Como necesitas usarlo ? Pon un ejemplo, gracias
Posted: Tue Dec 12, 2006 9:21 am
by Elias Torres
Hola Antonio. Si, se trata de una funcion que identifica el final del fichero binario. Lo que pretendo es poder quitar la cabecera de una tabla que esté enganchada a una *.dbc
Lo que pretendo es algo parecido a esto:
*** Abre fichero ***
local a,b,c,n
a= fopen('articulo.dbf',1)
*** Si no logra abrirlo ***
if a < 0
return
endif
*** Inicializa variables
c= 'datos.dbc' && se trata del enlace q tiene la tabla al *.dbc
n= 0
do while !feof(a)
b= lower(fread(a,1))
n= n + 1
c= right(c+b,9)
if c= 'datos.dbc'
fseek(a,0,0) && se posiciona al principio del fichero
fseek(a,n-9) && se posiciona al principio cadena encontrada
fwrite(a,replicate(chr(0),9)) && sustituye
endif
enddo
fclose(a)
Pero claro no me funciona. El problema lo tengo cuando he localizado la ristra 'datos.dbc'. Es decir, que en el if el valor de c es el que tiene que ser, es decir, que c='datos.dbc', pero luego a la hora de sustituir con el fwrite() parece que no remplaza lo que deberia. Supongo que el problema es debido al fseek(). Esto lo he probado en Fox puesto que en fwppc no me reconoce la función FEOF()....
Gracias y saludos.
Elías Torres.
Posted: Tue Dec 12, 2006 9:21 am
by Biel EA6DD
Code: Select all
FUNCTION fEof( nHandle )
LOCAL nCurPos, nEOF
nCurPos := fSeek( nHandle, 0, 1 )
nEOF := fSeek( nHandle, 0, 2 )
fSeek( nHandle, nCurPos, 0 )
RETURN nEOF <= nCurPos
Posted: Tue Dec 12, 2006 9:35 am
by Antonio Linares
Elías,
Otra forma de cambiar la cabecera sería:
MemoWrit( cDbfName, StrTran( MemoRead( cDbfName ), "datos.dbc", Replicate( Chr( 0 ), 9 ) ) )
Posted: Tue Dec 12, 2006 9:35 am
by Elias Torres
Hola Biel, gracias por la respuesta. Entiendo que debo poner esa función en mi código, no es asi?....
Una pregunta, ¿sabes porque el código que he puesto (un poco más arriba) no funciona?.....
Saludos.
Elías Torres.
Posted: Tue Dec 12, 2006 10:48 am
by Elias Torres
Antonio,
gracias por la respuesta. Funciona perfectamente. Lo único es que con una de las tablas parece que me la libera pero luego al hacer un use sobre ella me dice que está corrupta. Con las otras dos todo va perfecto.... Te he enviado a tu correo las tablas para ver si el problema lo tengo por la versión de la que dispongo o es otra cosa. Te agradecería que le echaras un vistazo y me indicaras cual es el problema...
Gracias...
Elías Torres.
Por cierto, el uso de la memoria para este tema se libera de alguna forma? o tengo que liberarla yo....
Posted: Tue Dec 12, 2006 11:12 am
by Biel EA6DD
Hola Elias,
si, debes añadir la funcion pues no existe fEof en Harbour.
Referente a porque no te funciona, pues a primera vista y sin probarlo, estas utilizando fRead, y esta funciona retorna los bytes leidos, y no la cadena leida. O bien usas fReadStr, o a fRead le pasas como parametro una variable por referencia donde te colocara lo leido.
Cambia esto, y vuelve a probar.
FREAD(<nHandle>, @<cBufferVar>, <nBytes>) --> nBytes
FREADSTR(<nHandle>, <nBytes>) --> cString
Posted: Tue Dec 12, 2006 12:20 pm
by Antonio Linares
Elias,
La memoria se libera automaticamente, no tienes que preocuparte por eso.
En cuanto a el uso de MemoWrit() funciona bien, lo que ocurre es que si más tarde quieres restaurar datos.dbc dentro de la DBF, hay que anotar la posición en donde estaba:
local cDBF := MemoRead( cDbfName )
local nAt := At( "datos.dbc", cDBF )
MemoWrit( ...
... tu código
cDbf = MemoRead( cDbfName )
cDbf = SubStr( cDbf, 1, nAt - 1 ) + "datos.dbc" + SubStr( cDbf, nAt + Len( "datos.dbc" ) )
MemoWrit( cDbfName, cDbf )
Posted: Tue Dec 12, 2006 4:30 pm
by Elias Torres
Gracias a los dos....
En cuanto a lo que me comentas Biel, no había caido en eso, lo probaré, gracias. Por otro lado Antonio, no se si me expliqué bien pero lo que me ocurre es que efectivamente la tabla me la libera (aparentemente) pero no puedo hacer uso de ella. Lo de restaurar datos.dbc no hace falta puesto que lo que hago es una copia a nivel local para poder trabajar con ellas y luego las elimino. Lo que pasa es que como te digo me funciona perfectamente para otras dos tablas pero para la tabla de articulos no me la abre, me vuelve a decir que está corrupta. Según me comentas ahí funciona por lo que me da que hay algo que yo no tengo en mi versión...
Estaba ya casi a punto de conseguir lo que quiero pero una vez más me he topado con otra pared, jejeje.
Seguiré mirando..
Saludos.
Elías Torres.
Posted: Tue Dec 12, 2006 7:16 pm
by Elias Torres
Hola...
Tengo una cosilla que comentar a ver que me podeis decir...
El problema que tenía al abrir la tabla articulo.dbf después de quitarle la cabecera 'datos.dbc' era debido al uso de _ monetarios. Los he quitado de la tabla haciendo pruebas y he comprobado que si los pongo no funciona y en cambio si los quito entonces funciona perfectamente. Entonces mi pregunta es la siguiente, ¿este lenguaje soporta el uso de _?... Yo supongo que si puesto que Antonio me comentó que le funcionaba correctamente. Entonces una vez más creo que voy a tener que actualizar la versión que tengo...
Saludos..
Elías Torres.
Posted: Tue Dec 12, 2006 7:31 pm
by Antonio Linares
Elías,
Que son _ monetarios ? Pon un ejemplo, por favor.
Puede ser que ese tipo de campos no esten soportados en harbour todavía.
Posted: Tue Dec 12, 2006 8:40 pm
by Elias Torres
Antonio,
me refiero a campos que se utilizan para monedas. En fox se declara como campos monetarios de longitud 8. En la tabla de articulos que te he pasado para la prueba están _ que te menciono... Por lo que me comentabas alli funciona pero a mi no. Los quito y si... Es algo muy raro..
Saludos.
Elías Torres.