Como puedo realizar una búsqueda de una palabra C

Iniciado por Alberto n, 5 Marzo 2019, 17:24 PM

0 Miembros y 1 Visitante están viendo este tema.

Alberto n

Me pueden ayudar con este problema en lenguaje C...

Como puedo buscar una palabra en especifico en un archivo, y al encontrarla realizar una pregunta de que si la segunda línea que sigue está vacia se la salte o que la borre...

Y que luego continue buscando en el resto del archivo, realizando la misma operación.

K-YreX

Si no me falla la cabeza, ya te han respondido en otro post.
Para ser exactos en ESTE POST
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Alberto n

Cita de: YreX-DwX en  5 Marzo 2019, 17:29 PM
Si no me falla la cabeza, ya te han respondido en otro post.
Para ser exactos en ESTE POST


Mi problema, que no deseo borrar todos los espacios en blanco...
Tengo un código que hace eso, lo que necesito es que busque una palabra y compruebe la segunda línea que continua esta vacía, y si es así borrarla...

K-YreX

Cita de: Alberto n en  5 Marzo 2019, 17:39 PM
Mi problema, que no deseo borrar todos los espacios en blanco...
Tengo un código que hace eso, lo que necesito es que busque una palabra y compruebe la segunda línea que continua esta vacía, y si es así borrarla...
Lo que no me queda muy claro es el proceso. Es decir, no sé que línea quieres borrar, si la que contiene la palabra que buscas o la que está vacía. Y tampoco sé si lo que quieres es borrar la línea del archivo original o hacer una copia y no copiar esa línea...
Si puedes poner un ejemplo exacto para ver cuál tendría que ser la salida del programa. :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Alberto n

#4
Cita de: YreX-DwX en  5 Marzo 2019, 17:44 PM
Lo que no me queda muy claro es el proceso. Es decir, no sé que línea quieres borrar, si la que contiene la palabra que buscas o la que está vacía. Y tampoco sé si lo que quieres es borrar la línea del archivo original o hacer una copia y no copiar esa línea...
Si puedes poner un ejemplo exacto para ver cuál tendría que ser la salida del programa. :-X

La línea que quiero borrar es la que esta vacía, y lo ideal es hacer una copia del archivo original sin copiar esa linea.

Ej: tengo un archivo con más de 10 mil líneas...

1-   Días de la semana
2-   lunes
3-   martes
4-  
5-   miércoles
6-   jueves
Etc...

Lo que necesito es que busque por ejemplo la palabra "semana" , y que verifique si la segunda línea que viene esta vacía, y si es así que la borre o no copie esa línea que esta vacía...

No se si me explico.

Este es el código que tengo hasta el momento, el cual me borra todas las líneas en blanco... y lo que no logro es lo que comento más arriba, de buscar la palabras y borrar o no copiar la segunda línea que continua luego de la palabra buscada.


Citar
#include <stdio.h>

int main(int argc, char** argv) {



FILE *f1=fopen("merge_20190214_090008_normal_caso_especifico.ps", "r");

FILE *f2=fopen("sal.txt", "w");

int Leidos, contador=0; // contador dice el numero de '\n' seguidos que encuentra

char aux;

while (feof(f1)==0)

{

Leidos=fread(&aux, sizeof(char), 1, f1);

if (Leidos > 0) {

contador= (aux=='\n') ? contador+1 : 0;

// se escribe solo si el caracter es distinto de '\n' o si es el primer

// '\n' que encuentra

if (contador==1 || aux!='\n')

fwrite(&aux, sizeof(char), 1, f2);


} else break;

}

printf("Proceso completado.\n");

fclose(f1);

fclose(f2);

return 0;

}

K-YreX

Veo que con una lectura secuencial del fichero se complica un poco la cosa ya que estamos haciendo referencia a dos líneas antes o dos líneas después de la actual (según el planteamiento). Entonces aunque pierda un poco de eficiencia, creo que es más fácil hacer una lectura completa del fichero, localizar todas las líneas que tienen la palabra guía y después hacer una segunda lectura para ir transcribiendo el fichero.

contador_linea := 0
mientras !fin(f1)
    linea_actual := leerLinea(f1)
    si encontrada(palabra_guia, linea_actual)
        cola.push(contador_linea + 2)
    fin si
    contador_linea := contador_linea + 1
fin mientras

contador_linea := 0
mientras !fin(1)
    linea_actual := leerLinea(f1)
    mientras !cola.empty() && !fin(f1)
        si contador_linea == cola.front()
            cola.pop()
            si linea_actual != "\n"
                escribirLinea(linea_actual, f2)
            fin si
        sino
            escribirLinea(linea_actual, f2)
        fin si
        linea_actual := leerLinea(f1)
        contador_linea := contador_linea + 1
    fin mientras
    escribirLinea(linea_actual, f2)
fin mientras

Si no me ha fallado nada me parece que eso funcionaría. Lo que haces es una primera lectura del fichero y cada vez que encuentras la palabra que buscas, metes en una cola la línea que igual no hay que copiar. Luego haces una segunda pasada y cuando coincida la línea actual con el front de la cola, compruebas si está vacía o no. Si está vacía, no la copias y sino lo está, sí. Además con el bucle interno, una vez que la cola esté vacía ya no hay que comprobar nada y puedes ir copiando más libremente.
PD: Seguramente se puede optimizar el código pero lo dejo así para que veas el planteamiento y ya te encargas tú de optimizarlo cuando lo estés implementando. Suerte :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Alberto n

Cita de: YreX-DwX en  5 Marzo 2019, 19:34 PM
Veo que con una lectura secuencial del fichero se complica un poco la cosa ya que estamos haciendo referencia a dos líneas antes o dos líneas después de la actual (según el planteamiento). Entonces aunque pierda un poco de eficiencia, creo que es más fácil hacer una lectura completa del fichero, localizar todas las líneas que tienen la palabra guía y después hacer una segunda lectura para ir transcribiendo el fichero.

contador_linea := 0
mientras !fin(f1)
    linea_actual := leerLinea(f1)
    si encontrada(palabra_guia, linea_actual)
        cola.push(contador_linea + 2)
    fin si
    contador_linea := contador_linea + 1
fin mientras

contador_linea := 0
mientras !fin(1)
    linea_actual := leerLinea(f1)
    mientras !cola.empty() && !fin(f1)
        si contador_linea == cola.front()
            cola.pop()
            si linea_actual != "\n"
                escribirLinea(linea_actual, f2)
            fin si
        sino
            escribirLinea(linea_actual, f2)
        fin si
        linea_actual := leerLinea(f1)
        contador_linea := contador_linea + 1
    fin mientras
    escribirLinea(linea_actual, f2)
fin mientras

Si no me ha fallado nada me parece que eso funcionaría. Lo que haces es una primera lectura del fichero y cada vez que encuentras la palabra que buscas, metes en una cola la línea que igual no hay que copiar. Luego haces una segunda pasada y cuando coincida la línea actual con el front de la cola, compruebas si está vacía o no. Si está vacía, no la copias y sino lo está, sí. Además con el bucle interno, una vez que la cola esté vacía ya no hay que comprobar nada y puedes ir copiando más libremente.
PD: Seguramente se puede optimizar el código pero lo dejo así para que veas el planteamiento y ya te encargas tú de optimizarlo cuando lo estés implementando. Suerte :-X



Gracias estimado por la ayuda, lo voy a implementar haber si logro hacerlo funcionar...

Alberto n

#7
.

Alberto n

Cita de: YreX-DwX en  5 Marzo 2019, 19:34 PM
Veo que con una lectura secuencial del fichero se complica un poco la cosa ya que estamos haciendo referencia a dos líneas antes o dos líneas después de la actual (según el planteamiento). Entonces aunque pierda un poco de eficiencia, creo que es más fácil hacer una lectura completa del fichero, localizar todas las líneas que tienen la palabra guía y después hacer una segunda lectura para ir transcribiendo el fichero.

contador_linea := 0
mientras !fin(f1)
    linea_actual := leerLinea(f1)
    si encontrada(palabra_guia, linea_actual)
        cola.push(contador_linea + 2)
    fin si
    contador_linea := contador_linea + 1
fin mientras

contador_linea := 0
mientras !fin(1)
    linea_actual := leerLinea(f1)
    mientras !cola.empty() && !fin(f1)
        si contador_linea == cola.front()
            cola.pop()
            si linea_actual != "\n"
                escribirLinea(linea_actual, f2)
            fin si
        sino
            escribirLinea(linea_actual, f2)
        fin si
        linea_actual := leerLinea(f1)
        contador_linea := contador_linea + 1
    fin mientras
    escribirLinea(linea_actual, f2)
fin mientras

Si no me ha fallado nada me parece que eso funcionaría. Lo que haces es una primera lectura del fichero y cada vez que encuentras la palabra que buscas, metes en una cola la línea que igual no hay que copiar. Luego haces una segunda pasada y cuando coincida la línea actual con el front de la cola, compruebas si está vacía o no. Si está vacía, no la copias y sino lo está, sí. Además con el bucle interno, una vez que la cola esté vacía ya no hay que comprobar nada y puedes ir copiando más libremente.
PD: Seguramente se puede optimizar el código pero lo dejo así para que veas el planteamiento y ya te encargas tú de optimizarlo cuando lo estés implementando. Suerte :-X


Estimado, estoy perdido en esta lineas del código, tengo lo siguiente:


#include <stdio.h>
#include <cstring>


int main() {


FILE *f1=fopen("merge.tx", "r");
FILE *f2=fopen("sal.txt", "w");

int contador_linea = 0;
char linea_actual;
char palabra_guia[30];


strncpy( palabra_guia, "NEW", sizeof(palabra_guia) );
   palabra_guia[sizeof(palabra_guia)-1] = 0;

if (f1==NULL) {

       printf("Error abriendo el fichero");

}

while (!feof(f1)) {

     linea_actual = leerLinea(f1);
     
     if (encontrada(palabra_guia, linea_actual)) {
     
      cola.push(contador_linea + 2);
     }
     
     contador_linea = contador_linea + 1;
     
}

contador_linea = 0;

while (!feof(f1) {

     linea_actual = leerLinea(f1);
     
     while (!cola.empty() && !feof(f1)) {
 
      if (contador_linea == cola.front()) {
   
       cola.pop()
     
       if (linea_actual != "\n") {
     
       escribirLinea(linea_actual, f2);
     
    } else {
   
        escribirLinea(linea_actual, f2);
       
        }
    }
   
       linea_actual = leerLinea(f1);
       contador_linea = contador_linea + 1;
     
   }
   
      escribirLinea(linea_actual, f2);
}
}



En esta linea ( " linea_actual = leerLinea(f1) " ), me sale 'LeerLine cannot be used as a function.  como puedo solucionarlo...

La otra es: ( "if (encontrada(palabra_guia, linea_actual)) " ), que esta haciendo aquí, y que es "encontrada"...

'cola' y 'escribirLinea', deben ser variables 'char', o estoy mal...

Perdón por mi falta de conocimiento, a lo mejor es bastante básico lo que pregunto, pero solo llevo un día en lenguaje C.

De antemano agradezco por su ayuda y tiempo.

K-YreX

Esos errores que te salen es porque eso son funciones que tienes que crear tú, o implementarlo directamente en la función <main> pero no son funciones que ya existan. Yo lo he usado para que veas el planteamiento, la parte de implementarlo que te queda a ti es la que consiste en traducir el planteamiento a lenguaje C.
Y si sólo llevas 1 día con la programación, este me parece un ejercicio demasiado complejo.

Las colas no están implementadas en C por lo que o lo implementas tú (lo que haría el programa más grande y complejo) o usas algún otro planteamiento.

Como puedes ver, en <linea_actual> queremos guardar una línea entera del fichero por lo que no puede ser un <char> sino un array de <char> (tienes que ver también el tamaño para poder guardar todas las líneas).
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;