/* -------------------------------*/
/* grep_rw */
/* */
/* Búsqueda de una cadena en */
/* varios archivos con la técnica */
/* read/write */
/*--------------------------------*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/time.h>
int grep_rw (char *cadena, char *archivo) {
int descriptor, valor_lectura, linea=1, linea_vista=0, interruptor=0, i= 0;
char letra[1], candidata[1024] = "";
// Nos servimos de la estructura timeval de sys/time.h para guardar los tiempos del principio y fin de ejecución:
struct timeval ti, tf;
// Tomamos el tiempo antes de empezar las operaciones.
gettimeofday (&ti, NULL);
// Abrimos fichero.
descriptor = open(archivo, O_RDONLY);
// Comprobamos si el fichero se ha abierto correctamente.
if (descriptor == -1) {
printf("\n-> Error al abrir [%s]", archivo);
return (0);
}
else
printf("\n-> [%s] abierto correctamente.", archivo);
// Empezamos a leer el fichero:
valor_lectura = read (descriptor, (char *)letra, 1);
// Comprobamos si ha leído correctamente. Si es así, seguimos leyendo.
if (valor_lectura == -1)
printf("\n-> Error al leer [%s]\n", archivo);
else {
printf("\n-> Lectura de [%s] correcta.\n", archivo);
while (valor_lectura > 0) { // Mientras no se acabe el fichero...
while (letra[0] != '\n') { // Mientras la letra leída no sea un salto de línea...
// Concatenamos lo que llevamos leído de la línea con la nueva letra leída.
//i ++;
sprintf (candidata, "%s%s", candidata, letra);
valor_lectura = read (descriptor, (char *)letra, 1);
}
printf("%s\n", candidata);
// Comprobamos si la línea candidata que llevamos leída contiene la cadena buscada, y también si ya lo hemos comprobado con esa misma línea.
//candidata[i+1] = '\0';
if ((strstr(candidata, cadena) != NULL) && (linea != linea_vista)) {
interruptor = 1;
printf("Lalalalalalallal\n");
printf("\n[%s] está en la línea %d", cadena, linea);
linea_vista = linea;
}
// Seguimos leyendo el fichero.
// valor_lectura = read (descriptor, (char *)letra, 1);
//}
//i = 0;
linea ++;
valor_lectura = read (descriptor, (char *)letra, 1);
// Iniciamos a nada el valor de la línea candidata en la que después buscaremos la cadena.
candidata[0] = '\0';
}
// En caso de que no se haya encontrado ninguna vez la cadena:
if (interruptor == 0)
printf("\nNo se ha encontrado la palabra buscada en el archivo %s\n", archivo);
}
// Cerramos el fichero y comprobamos si se ha hecho correctamente.
close(descriptor);
if (descriptor==-1) {
printf("\n\n-> ERROR. [%s] no se ha cerrado correctamente\n",archivo);
return (0);
}
else
printf("\n\n-> [%s] cerrado correctamente\n",archivo);
// Volvemos a tomar el tiempo después de las operaciones y devolvemos un valor de la función igual a la diferencia entre el tiempo inicial y el final (en microsegundos).
gettimeofday (&tf, NULL);
return ((tf.tv_sec * 1000000 + tf.tv_usec) - (ti.tv_sec * 1000000 + ti.tv_usec));
}