Pages: [1]   Go Down
Author Topic: ayuda funcion seek()  (Read 1870 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola!
tengo un archivo de texto en mi SD, quiero apuntar las líneas de dicho archivo con un puntero para poder moverme de una a otra. Por lo que he estado mirando por ahí la función que más se ajusta a lo que necesito es la de seek(). Lo que he encontrado de ejemplos es muy poco y no me ha quedado muy claro como funciona la instrucción. He entendido lo siguiente, hay dos formas de usarla:
- archivo.seek(pos): busca una posición en el archivo y devuelve true o false y la encuentra o no.
-archivo.seek(   ,    ,    ,) : el primer espacio es para el puntero a archivo, el último para situarse en el archivo(SEEK_SET(principio),SEEK_CUR(posición actual),SEEK_END(final)), pero la posición del medio no se para que sirve.

Esta última es la que yo necesito, pero no se usarla.

Me podría ayudar alguien? Muchas gracias.
Logged

Euskadi
Offline Offline
God Member
*****
Karma: 16
Posts: 724
Arduinotarrak
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola,
el valor del medio es para decirle cuántas posiciones tiene que desplazarse a partir del punto que se indica en el tercero. Mira en google "fseek", que es el nombre de la función en C

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Gracias por contestar curro92.
Voy a seguir mirando por internet porque no se si me servirá esta instrucción para lo que busco, quiero apuntar con el puntero y que me lea toda una línea y así consecutivamente(no puedo dar un número de desplazamiento fijo puesto que las líneas son de distinto tamaño). Podría poner en el medio condición de salto de línea? así estaría todo solucionado.

Eskerrik asko!
Logged

Euskadi
Offline Offline
God Member
*****
Karma: 16
Posts: 724
Arduinotarrak
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola,
no entiendo muy bien: ¿quieres leer líneas de texto, pero no secuencialmente, si no eligiengo tú la línea en cada caso? Para eso se supune que tienes una lista de posiciones del comienzo de cada línea, por ejemplo en un
Code:
long posiciones[MAX_POSIC]
. ¿Tienes esa lista de posiciones? Para usar seek() o tienes el fichero organizado en registros de longitud igual, o necesitas una especie de índice de comienzos de línea en un array long. La otra posibilidad es no usar  seek() e ir leyendo secuencialmente las líneas hasta llegar a la que interese.

« Last Edit: October 15, 2012, 11:23:04 pm by curro92 » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buenas,
yo tengo un archivo de texto con una cantidad de líneas que leo como caracteres,cada línea puede variar su tamaño.
No he creado ningun array de posiciones puesto que en ocasiones el número de líneas es muy grande.
Lo que intento hacer en mi programa es una comparación de datos entre una línea y otra y según el resultado apuntar a una u otra.Es aquí donde no encuentro la solución, como puedo pasar de líneas con el puntero???

Logged

Euskadi
Offline Offline
God Member
*****
Karma: 16
Posts: 724
Arduinotarrak
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola,
tendrías que guardar la posición del puntero al empezar a leer la línea en una variable  long. Para obtener la posición en C se usa ftell(), en tu caso creo
long posicion1 = archivo.position();
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

a ver si me he enterado, la instrucción archivo.position() me devuelve una posición del archivo, en mi caso quiero que sea la que apunta el puntero(en cada comienzo de línea).
Pero como las relaciono? Es que el tema de los punteros es algo que nunca se me ha dado bien... he probado esto y me da error (puede que sea una burrada..)

unsigned long *p;
unsigned long pos;

pos=dataFile.position();
p=pos;  // Seguramente así no se hace para que el puntero apunte a la posicion que quiero
Logged

Euskadi
Offline Offline
God Member
*****
Karma: 16
Posts: 724
Arduinotarrak
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola,
cuando aquí  hablo de puntero me refiero al puntero que lee el fichero, no se trata de punteros  a variables.
Cuando abres un fichero, si haces
Code:
pos=dataFile.position();
dará pos = 0
Si lees 10 caracteres (bytes) desde el fichero, entonces será pos = 10

En tu caso, si tuvieras que tratar 10 líneas definiría un
Code:
long pos[10]; // 10 enteros largos que guarden las 10 posiciones de comienzo de cada línea
Para poder saltar de una línea a otra, primero tendrás que guardar la posición del comienzo de cada línea en pos[]
(Eso lo podrías hacer al grabarlas la primera vez, o haciendo una lectura secuencial de principio a fin, tomando la position() al comienzo de cada línea)
Cuando quieras leer la línea 5, haces
Code:
archivo.seek(miFichero, long[4], SEEK_SET);
y luego lees hasta el final de línea.

« Last Edit: October 17, 2012, 09:57:41 pm by curro92 » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Muchíisimas gracias Curro92, me has ayudado mucho, la verdad es que tenía un buen lio de conceptos y me has aclarado. He conseguido hacer el programa que quería!!!! Además me di cuenta que se podía hacer de otra forma más sencilla:
- ir leyendo cada línea (diferenciando el carácter salto de línea)
- separo los datos de esa línea que yo quiero usar
- leo siguiente línea y separo datos
- opero con los datos separados y me quedo con el valor y línea que me interesa
- me guardo este valor en una variable y voy comparando sucesivamente con los siguientes
- repito esta operación hasta el final de archivo

GRACIASS POR TU TIEMPO Y AYUDA!!!!
Logged

Euskadi
Offline Offline
God Member
*****
Karma: 16
Posts: 724
Arduinotarrak
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola,
me alegro de que hayas aclarado tus dudas.
Logged

Pages: [1]   Go Up
Jump to: