feof()???

feof()???

Postby Elias Torres » Mon Dec 11, 2006 1:17 pm

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.
Elias Torres
 
Posts: 233
Joined: Wed Aug 09, 2006 3:07 pm

Postby Antonio Linares » Mon Dec 11, 2006 11:25 pm

Elías,

Es una función de FoxPro ? Que indica final de un fichero binario ó de texto ?

Como necesitas usarlo ? Pon un ejemplo, gracias
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41321
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby Elias Torres » Tue Dec 12, 2006 9:21 am

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.
Elias Torres
 
Posts: 233
Joined: Wed Aug 09, 2006 3:07 pm

Postby Biel EA6DD » Tue Dec 12, 2006 9:21 am

Code: Select all  Expand view
FUNCTION fEof( nHandle )
   LOCAL nCurPos, nEOF
   nCurPos := fSeek( nHandle, 0, 1 )
   nEOF    := fSeek( nHandle, 0, 2 )
   fSeek( nHandle, nCurPos, 0 )
RETURN nEOF <= nCurPos
Saludos desde Mallorca
Biel Maimó
http://bielsys.blogspot.com/
User avatar
Biel EA6DD
 
Posts: 682
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca

Postby Antonio Linares » Tue Dec 12, 2006 9:35 am

Elías,

Otra forma de cambiar la cabecera sería:

MemoWrit( cDbfName, StrTran( MemoRead( cDbfName ), "datos.dbc", Replicate( Chr( 0 ), 9 ) ) )
Last edited by Antonio Linares on Tue Dec 12, 2006 9:36 am, edited 1 time in total.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41321
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby Elias Torres » Tue Dec 12, 2006 9:35 am

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.
Elias Torres
 
Posts: 233
Joined: Wed Aug 09, 2006 3:07 pm

Postby Elias Torres » Tue Dec 12, 2006 10:48 am

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....
Elias Torres
 
Posts: 233
Joined: Wed Aug 09, 2006 3:07 pm

Postby Biel EA6DD » Tue Dec 12, 2006 11:12 am

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
Saludos desde Mallorca
Biel Maimó
http://bielsys.blogspot.com/
User avatar
Biel EA6DD
 
Posts: 682
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca

Postby Antonio Linares » Tue Dec 12, 2006 12:20 pm

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 )
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41321
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby Elias Torres » Tue Dec 12, 2006 4:30 pm

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.
Elias Torres
 
Posts: 233
Joined: Wed Aug 09, 2006 3:07 pm

Postby Elias Torres » Tue Dec 12, 2006 7:16 pm

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 unos campos 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 estos campos?... 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.
Elias Torres
 
Posts: 233
Joined: Wed Aug 09, 2006 3:07 pm

Postby Antonio Linares » Tue Dec 12, 2006 7:31 pm

Elías,

Que son los campos monetarios ? Pon un ejemplo, por favor.

Puede ser que ese tipo de campos no esten soportados en harbour todavía.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41321
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby Elias Torres » Tue Dec 12, 2006 8:40 pm

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 los campos 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.
Elias Torres
 
Posts: 233
Joined: Wed Aug 09, 2006 3:07 pm


Return to FiveWin para Pocket PC

Who is online

Users browsing this forum: Google [Bot] and 2 guests