 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Alfonso Invitado
|
Publicado: Mar 17 Abr, 2001 11:57 pm Asunto: Busqueda de cadenas en ficheros de texto |
|
|
Alguien me podría orientar como podría buscar una cadena expecífica en un fichero de texto, ¿hay alguna función para buscar? o tengo que ir mirando caracter por caracter todo el fichero.Gracias por leer el mensaje |
|
| Volver arriba |
|
 |
J.B Invitado
|
Publicado: Mie 18 Abr, 2001 11:20 pm Asunto: Busqueda de cadenas en ficheros de texto |
|
|
Eso se puede hacer de muchas maneras, aunque yo no te aconsejo que uses un TMemo si vas a usar archivos binarios o archivos muy gandes. Lo mas sencillo es leer bloques del fichero y buscar en ellos la cadena usando la funcion strstr. Una ejemplo podria ser el siguiente:long BuscaTexto(char NombreArchivo[], char CadenaBuscada[]) // Funcion que devuelve el numero de bloque donde esta la cadena que buscamos. (1 Bloque = 255 bytes). { FILE *Archivo; long Bloque, LongitudArchivo; char Buffer[255]; if((Archivo = fopen(NombreArchivo, "rb")==NULL)){ // No se pudo abrir el fichero. sprintf(Buffer, "\nNo se pudo abrir el fichero '%s'\n", NombreArchivo); ShowMessage(Buffer); return(-1); } LongitudArchivo = filelength(fileno(Archivo)); Bloque = -1; while(LongitudArchivo >= 255){ //Leemos un bloque de 255 bytes. fread(Buffer, 255, 1, &Archivo); LongitudArchivo = (LongitudArchivo - 255); Bloque++; if(strstr(Buffer, CadenaBuscada)){ // Hemos encontrado la cadena. return(Bloque); } } if(LongitudArchivo > 0){ // Quedan menos de 255 bytes a leer. fread(Buffer, LongitudArchivo, 1, &Archivo); Bloque++; if(strstr(Buffer, CadenaBuscada)){ // Hemos encontrado la cadena. return(Bloque); } } return(-1); } Espero que sea lo que estabas buscando. |
|
| Volver arriba |
|
 |
joseluisbz Invitado
|
Publicado: Jue 19 Abr, 2001 2:08 am Asunto: Busqueda de cadenas en ficheros de texto |
|
|
La verdad no sé ... Lo que se me ocurre a mí es cargar el archivo de texto en un contenedor tipo TMemo o tipo TRichEdit... Y ya de ahí tratar con la propiedad Text de ambos componentes(Objetos)... |
|
| Volver arriba |
|
 |
Alfonso Invitado
|
Publicado: Lun 23 Abr, 2001 9:22 am Asunto: Busqueda de cadenas en ficheros de texto |
|
|
| Gracias J.B. era lo que buscaba |
|
| Volver arriba |
|
 |
joseluisbz Invitado
|
Publicado: Mar 24 Abr, 2001 2:14 am Asunto: Busqueda de cadenas en ficheros de texto |
|
|
Interesante tu respuesta... No he probado el código... Solo por curiosidad... Que pasa si se atrapa solo un pedazo de la cadena que si está completamnete?Ejemplo: que en el texto esté la cadena... Cadena1 y que por alguna razón se obtenga Cad... Hmmm joseluisbz@bigfoot.com |
|
| Volver arriba |
|
 |
Alejandro Invitado
|
Publicado: Mar 24 Abr, 2001 4:08 am Asunto: Busqueda de cadenas en ficheros de texto |
|
|
Hola chicos, como un umilde aporte a la confución general, permítanme coincidir con joseluisbz. Me explico: Supongamos que la cadena buscada tiene 10 caracteres, ubicados desde el caracter 250 hasta el 259. En este caso, leer y transferir bloques de 255 bytes no permite encontrarla. Otra opción: 1- Leer el archivo byte a byte, hasta encontrar el primer caracter de la cadena buscada. 2- leer los sizeof(cadena) siguientes y compararlos con la cadena. 2.a - Si se encontró la cadena, bien; incluso se puede ir por otra igual. 2.b - Si no es ésta, a buscar de nuevo (1)
|
|
| Volver arriba |
|
 |
_Leo Invitado
|
Publicado: Mar 24 Abr, 2001 9:23 am Asunto: Busqueda de cadenas en ficheros de texto |
|
|
| Hola, otra opción, una función de busqueda que aprovecha la proyección de archivos en memoria de Windows, es bastante rápida y permite trabajar con archivos muy grandes. Aunque aun hay que probarla un poco mas, de momento la he probado mientras la estaba haciendo y no me ha dado problemas, eso si, solo la he podido probar en Win2000 (se agradecen comentarios si alguien la prueba en otras versiones de Windows). Bueno, aquí va la función: (hay que añadir: #include <string.h> (por 'strlen'))
code:
// Entrada: // szFile = Path del fichero donde se va a buscar // szText = La cadena que queremos buscar // Salida: // devuelve la posición dentro del fichero donde se // encontro la cadena o 0 en caso de no encontrarla // (NOTA: la primera posición es 1) int FindTextInFile(const char *szFile, const char *szText) { // Abre el fichero HANDLE hFile = CreateFile(szFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (hFile != INVALID_HANDLE_VALUE) { // Lo proyecta en memoria HANDLE hMap = CreateFileMapping(hFile, 0, PAGE_READONLY, 0, 0, 0); if (hMap) { LPVOID lpFileView = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0); if (lpFileView) { char *szFileBuff = (char*)lpFileView; int FileSize = GetFileSize(hFile, NULL); int i, j, LengthText = strlen(szText); for (i=0; i<FileSize; i++) { // Busca el primer caracter if ((szFileBuff[i]==szText[0]) && (i+LengthText<=FileSize)) { // Los siguientes for (j=1; j<LengthText; j++) if (szFileBuff[i+j] != szText[j]) break; // Encontrado!!, rompe el bucle if (j == LengthText) break; } } if (i < FileSize) return i+1; UnmapViewOfFile(lpFileView); } CloseHandle(hMap); } CloseHandle(hFile); } return 0; }
Y el modo de uso, por ejemplo: int i = FindTextInFile("c:\\MiFichero.txt", "frase a buscar"); if (i) ShowMessage("Encontrado!! Pos=" + IntToStr(i)); else ShowMessage("No se encontro."); Espero que te sea útil. Saludos.
|
|
| Volver arriba |
|
 |
dcelso@terra.es Invitado
|
Publicado: Jue 26 Abr, 2001 2:18 am Asunto: Busqueda de cadenas en ficheros de texto |
|
|
Que pasa no os gusta la orientación a objetos (solo si es fichero de texto)? TStringList *fichero; fichero= new TStringList; fichero->LoadFromFile("nota.txt"); if (fichero->Text.AnsiPos("estoy")!=0) ShowMessage("cadena encontrada");delete fichero; |
|
| Volver arriba |
|
 |
dcelso@terra.es Invitado
|
Publicado: Jue 26 Abr, 2001 2:48 am Asunto: Busqueda de cadenas en ficheros de texto |
|
|
Me he dado cuenta que richedit tiene un metodo para buscar cadenas RichEdit1->FindText("texto", StartPos, ToEnd, TSearchTypes()<< stMatchCase); Mira la ayuda para mas informacion |
|
| Volver arriba |
|
 |
_Leo Invitado
|
Publicado: Jue 26 Abr, 2001 5:33 am Asunto: Busqueda de cadenas en ficheros de texto |
|
|
| Si, es mucho mas sencillo hacerlo asi, solo hay un problema, que estamos cargando el archivo completo en memoria cada vez, y bien esto no esta mal cuando son archivos pequeños, pero si tenemos archivos grandes y tenemos que buscar en varios, la diferencia de velocidad se notara bastante. |
|
| Volver arriba |
|
 |
J.B Invitado
|
Publicado: Jue 26 Abr, 2001 3:11 pm Asunto: Busqueda de cadenas en ficheros de texto |
|
|
| Vaya, pues si que ha tenido exito mi respuesta.... me voy unos dias y mira la que he montado. Respecto a lo de busquedas de subcadenas en cadenas... pues si, obviamente el metodo de busqueda no esta muy depurado que se diga, pero el codigo lo escribí directamente como respuesta de la pregunta, y no lo he probado, aunque supongo que funcionara bien. Ese mismo problema lo tendremos si queremos buscar cadenas con una longitud mayor de 255 caracteres. Seria cuestion de depurar un poco el codigo, nada más. Ademas, el codigo es 100% C, nada de APIs ni uso de controles, lo cual puede ser una ventaja o problema... segun se mire. Y como siempre, todo se puede hacer de multitud de formas, y seguro que cada programador enfoca el problema de distinta manera... es lo que más me gusta de la programación. Saludos. |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|