feof()???
-
- Posts: 233
- Joined: Wed Aug 09, 2006 3:07 pm
feof()???
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.
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.
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
-
- Posts: 233
- Joined: Wed Aug 09, 2006 3:07 pm
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.
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.
- Biel EA6DD
- Posts: 680
- Joined: Tue Feb 14, 2006 9:48 am
- Location: Mallorca
- Contact:
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
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Elías,
Otra forma de cambiar la cabecera sería:
MemoWrit( cDbfName, StrTran( MemoRead( cDbfName ), "datos.dbc", Replicate( Chr( 0 ), 9 ) ) )
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.
-
- Posts: 233
- Joined: Wed Aug 09, 2006 3:07 pm
-
- Posts: 233
- Joined: Wed Aug 09, 2006 3:07 pm
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....
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....
- Biel EA6DD
- Posts: 680
- Joined: Tue Feb 14, 2006 9:48 am
- Location: Mallorca
- Contact:
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
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
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
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 )
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 )
-
- Posts: 233
- Joined: Wed Aug 09, 2006 3:07 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.
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.
-
- Posts: 233
- Joined: Wed Aug 09, 2006 3:07 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 _ 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.
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.
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
-
- Posts: 233
- Joined: Wed Aug 09, 2006 3:07 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 _ 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.
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.