FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Busqueda de un string a lo largo de un TFileStream.
Hola Foro!!!
Es mi primer post y ojala pueda escribir muchos mas. Tengo un problema el cual no pude resolver por que mi experiencia en Delphi aun no es mucha. Lo que quiero hacer es ir leyendo un archivo, encotrar una cadena, guardar unos datos en una variable y seguir buscando esa cadena. Lo logre de una forma no muy convincente que digamos. Les paso a mostrar mi funcion a ver si pueden ayudarme.
Para utilizarla hago de la siguiente manera: El ST es un St : TStringList.Create; St := BuscarVags ('c:\Temporal\W2002j10.RA','VAGp'); Lo hace todo bien, lo que pasa es que el archivo que leo es de 40 MB y pueden llegar a ser mas grandes. Mi idea principal era leer de a bloques de a 8192 bytes, pero la verdad es que no se como hacer para cuando termina el archivo, por que la variable OFFSET nunca va a llegar a ser mayor o igual al tamaño del archivo. No se me ingenio otra manera que esa y estuve tratando toda la noche. Si alguien es tan amable de aclararme las ideas por favor, la verdad, lo estoy necesitando. Saludos! y muchas gracias. Última edición por MaxiDucoli fecha: 26-08-2007 a las 02:32:42. |
#2
|
||||
|
||||
Así por encima, el problema que le veo a leerlo por bloques, es que puedes tener la mala pata (debería ser muy mala pata, pero existe esta posibilidad xD) de que corte la frase que estas buscando, en 2 bloques diferentes... :s Y deberías controlar esto...
De forma rápida, creo que seria mejor buscarlo de golpe, pero ahí entra el inconveniente del tamaño del fichero, pero imagino que no seria problema cargar un fichero de 40 Mb o mas... ahí ya no me meto... Cuando digo cargarlo todo de golpe, me refiero en cargarlo en un TStringList y hacer un Pos... Ejemplo:
Bueno, es lo máximo que puedo ayudarte en estos momentos.. hehe Ah, y te recomiendo usar las etiquetas de código delphi, ayudarías mucho a que se entendiera el código, que leerlo así como lo has puesto da un poco de pereza...! Saludos. |
#3
|
|||
|
|||
Lo que pasa es POS solamente te busca el primer valor.
Con POSEX le podes poner el offset en donde buscar, entonces si le hago una variable a buscar y despues el entero que me devuelve le sumo 1 me busca desde ahi en adelante. Se que pudo cargar por bloques, leer, si no lo encuentro retroceder un poco dentro de la misma lectura, si no pasa nada que lea otro bloque y asi hasta encontrar. Mi problema esta en que no se como hacer para finalizar el repeat UNTIL ¿¿¿QUE???? eso no se me ocurre de ninguna manera. Ayuda please |
#4
|
||||
|
||||
La verdad es que no entendí mucho que es lo que quieres hacer, ya que si buscas una cadena en el archivo y cuando la encuentras la guardas en una lista, cuando finalices tendrás una lista llena de la misma cadena que buscabas
No sé si yo soy tonto y no entendí, o no te expresaste bien, agradecería un ejemplo de lo que quieres hacer para poder ayudarte. |
#5
|
|||
|
|||
Cita:
Bueno, tengo que buscar una palabra "VAGp" es la palabra, que corresponde al cabezal de muchos archivos de sonido de PlayStation. Bueno, adentro del archivo hay como 300 vagp, entonces yo encuentro uno, la funcion POSEX me dice donde la encontro (en que OFFSET), yo guardo eso en la lista, y le digo a la funcion que busque otra vez por que la pongo en un repetir, pero le subo una posicion al offset para que no me encuentre lo mismo y asi sucesivamente hasta terminar el archivo. Pero eso en un Buffer de todo el archivo, y lo que yo quiero es hacerlo en pequeños trozos y no en un buffer del archivo completo. Se entendio? |
#6
|
||||
|
||||
Hola,
En DelphiArea, entre otros, puede conseguirse el componente TFindFile, que, además de buscar archivos, es capaz de buscar en su interior. El procedimiento que se utiliza se me hace muy estudiado, muy bien hecho. Podrías estudiar el funcionamiento del mismo o bien utilizar el componente, directamente. |
#7
|
|||
|
|||
Muchas gracias, lo voy a investigar a ver como es.
|
#8
|
||||
|
||||
Viendo el codigo de este componente me surgieron unas dudas:
Q hacen estas lineas de codigo?
Y por ejemplo cuando declara las constantes lo hace de la siguiente manera:
Porq y porq le da esos valores a las constantes O si alguien me puede indicar q deberia leer para entenderlo mejor les estaria agradecidos... {Saludos} |
#9
|
||||
|
||||
Los valores dados a esas variables son para poder identificar luego los atributos del archivo con el cual se va a trabajar.
En cuanto a las líneas de código que te refieres son directivas para el compilador. Por ejemplo la directiva indica al compilador que Incluya el archivo DELPHIAREA.INC, en tanto que la directiva se comporta como un condicional if then else, e indica al compilador que si la versión del compilador es 6 o superior (6_UP) entonces desactive (OFF) las advertencias (WARN) de exclusividad de plataforma de unidades (UNIT) y símbolos (SYMBOL), de tal forma que si usas un símbolo que es exclusivo de la plataforma en que estás trabajando (Windows, por ejemplo) el compilador no te advertirá de ello cuando realice la compilación (por defecto te lo advierte). Si el compilador es de una versión inferior a la 6 estas directivas no se procesarán, ya que no son necesarias porque estos compiladores no traían advertencias de plataforma y por lo tanto no tienen incluídas estas directivas. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Como Transormar un string largo a Integer largo | RodoRodo | Varios | 1 | 27-06-2007 02:26:29 |
TFileStream | jorge_mosquera | Varios | 1 | 03-03-2007 16:28:45 |
Búsqueda muy específica en un string... | JuanBCT | Varios | 15 | 02-05-2005 14:58:00 |
Uso de TFileStream | esocrates | Varios | 4 | 09-04-2005 23:47:17 |
TFileStream | doverzhoff | Varios | 1 | 25-10-2003 18:49:38 |
|