elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Como puedo realizar una búsqueda de una palabra C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Como puedo realizar una búsqueda de una palabra C  (Leído 2,667 veces)
Alberto n

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Como puedo realizar una búsqueda de una palabra C
« en: 5 Marzo 2019, 17:24 pm »

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.


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Como puedo realizar una búsqueda de una palabra C
« Respuesta #1 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


En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Alberto n

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Como puedo realizar una búsqueda de una palabra C
« Respuesta #2 en: 5 Marzo 2019, 17:39 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...
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Como puedo realizar una búsqueda de una palabra C
« Respuesta #3 en: 5 Marzo 2019, 17:44 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
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Alberto n

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Como puedo realizar una búsqueda de una palabra C
« Respuesta #4 en: 5 Marzo 2019, 18:17 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;

}
« Última modificación: 5 Marzo 2019, 18:27 pm por Alberto n » En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Como puedo realizar una búsqueda de una palabra C
« Respuesta #5 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.
Código:
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
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Alberto n

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Como puedo realizar una búsqueda de una palabra C
« Respuesta #6 en: 5 Marzo 2019, 20:04 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.
Código:
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...
En línea

Alberto n

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Como puedo realizar una búsqueda de una palabra C
« Respuesta #7 en: 5 Marzo 2019, 21:12 pm »

.
« Última modificación: 5 Marzo 2019, 21:17 pm por Alberto n » En línea

Alberto n

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Como puedo realizar una búsqueda de una palabra C
« Respuesta #8 en: 5 Marzo 2019, 21:16 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.
Código:
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:

Código:
#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.
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Como puedo realizar una búsqueda de una palabra C
« Respuesta #9 en: 5 Marzo 2019, 21:41 pm »

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).
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Como puedo realizar esta consulta?
Bases de Datos
Skeletron 7 4,907 Último mensaje 13 Enero 2011, 04:00 am
por Novlucker
Conseguir todos los resultados de la búsqueda de una palabra en un archivo
PHP
SCM 1 1,260 Último mensaje 27 Febrero 2013, 02:10 am
por it3r
Como realizar una busqueda
.NET (C#, VB.NET, ASP)
arts 5 2,428 Último mensaje 23 Mayo 2013, 19:59 pm
por $Edu$
Ayuda con búsqueda de palabra en txt
Programación C/C++
ZedGe 4 2,873 Último mensaje 2 Septiembre 2013, 11:58 am
por eferion
realizar un programa que ingresando una palabra por teclado ella se mueva. « 1 2 »
Programación C/C++
fernandoprog1 16 4,622 Último mensaje 22 Junio 2015, 19:46 pm
por fernandoprog1
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines