C: Búsqueda de una cadena en un archivo

angelorz

Buenas, necesito una función que me busque una cadena en un archivo pero no encuentro ninguna en las liberías "oficiales".

¿Existe algo parecido al grep o al fgrep de shell pero en C?

No se me ocurre ahora mismo cómo montarme una función yo mismo...

A ver si alguien me echa un cable.

Gracias!

elkaoD

Para montarte una función tú mismo sólo necesitas un while byte a byte. Si en algún momento encuentras el primer byte de tu cadena a buscar, compruebas el siguiente (para ambas) con otro bucle. Si casa, sigue con la operación hasta el final de la cadena objetivo. Si no, reset.

No sé sime he explicado bien pero tengo prisa que tengo un examen. Si no, luego amplío.

1 respuesta
TaiCHoKe

char *strstr(const char *s1, const char *s2);

Busca s1 en s2. Devuelve un puntero donde este contenido el string, si no existe devuelve null

TaiCHoKe

Pero vas a tener que volcar el contenido de todo el fichero antes

1 respuesta
allmy

#1 Abrir archivo, buscar por cadena, cerrar archivo.

Mira por aquí:

http://zarza.usal.es/fgarcia/doc/tuto2/III_2.htm

LOc0

http://linux.die.net/man/2/mmap

http://msdn.microsoft.com/en-us/library/aa366761.aspx

+

http://www.cplusplus.com/reference/clibrary/cstring/strstr/

Salu2 ;)

Buffoncete

#4 y si el fichero tiene 100 megas apaga y vámonos.

fopen
fseek
fclose

son tus amigos

2 respuestas
TaiCHoKe

#7 Depende del tipo de archivo que tengas. Con un archivo pequeño con strstr te da de sobra. Si lo que quieres es parsear un archivo a lo bruto pues lo que has dicho tu.

Si sabes la estructura que tiene la informacion pues hazte una base de datos hoyga

elkaoD

Venga, un pseudocódigo rápido (en caso de que no te valga el strstr por el tamaño del archivo):

char *buscar;
int desplazamiento;
char leido;
while ( (leido = leercaracter()) != FEOF && desplazamiento < tamaño_buscar) {
    if ( buscar[desplazamiento] != leido )
        desplazamiento = 0;
    else if ( buscar[desplazamiento] == leido )
        desplazamiento++;
}

if ( desplazamiento == tamaño_buscar )
    int posicion_en_archivo = ftell() - tamaño_buscar;
else
    caca!;

O algo así. Seguro que se me han ido los índices pero paso de comprobar xD

Lecherito

#7 Podrías poner algun ejemplo real de fseek?, estuve intentandolo durante un tiempo pero no consegui hacerle funcionar.

1 respuesta
TaiCHoKe

#10 int fseek(FILE *stream, long offset, int whence);

stream es el descriptor que obtienes con fopen, el offset la cantidad de bytes que quieres saltar, y whence desde donde tomas tu referencia de salto.

whence puede ser
SEEK_SET: desde el inicio
SEEK_CUR: desde la posición actual del puntero
SEEK_END: desde el final

1 respuesta
angelorz

Wow! Muchísimas gracias a todos :) Se me había ocurrido hacer lo de #2, pero me parecía muy largo. Aún así intentaré implementar algo parecido ^^

Con la de alternativas que me habéis planteado creo que tengo de sobra xD Mil gracias! No sabía que funcionaba tan bien este subforo O_O

Lecherito

#11 La teoría sí que la sé, pero en la práctica no me funcionaba u.u

Usuarios habituales

  • Lecherito
  • angelorz
  • TaiCHoKe
  • elkaoD
  • Buffoncete
  • LOc0
  • allmy