Autor
|
Tema: Como puedo realizar una búsqueda de una palabra C (Leído 3,101 veces)
|
Alberto n
Desconectado
Mensajes: 8
|
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
|
Si no me falla la cabeza, ya te han respondido en otro post. Para ser exactos en ESTE POST
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
Alberto n
Desconectado
Mensajes: 8
|
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
|
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.
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
Alberto n
Desconectado
Mensajes: 8
|
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. 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. #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
|
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
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
Alberto n
Desconectado
Mensajes: 8
|
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 Gracias estimado por la ayuda, lo voy a implementar haber si logro hacerlo funcionar...
|
|
|
En línea
|
|
|
|
Alberto n
Desconectado
Mensajes: 8
|
.
|
|
« Última modificación: 5 Marzo 2019, 21:17 pm por Alberto n »
|
En línea
|
|
|
|
Alberto n
Desconectado
Mensajes: 8
|
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 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.
|
|
|
En línea
|
|
|
|
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).
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Como puedo realizar esta consulta?
Bases de Datos
|
Skeletron
|
7
|
5,129
|
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,406
|
27 Febrero 2013, 02:10 am
por it3r
|
|
|
Como realizar una busqueda
.NET (C#, VB.NET, ASP)
|
arts
|
5
|
2,651
|
23 Mayo 2013, 19:59 pm
por $Edu$
|
|
|
Ayuda con búsqueda de palabra en txt
Programación C/C++
|
ZedGe
|
4
|
3,156
|
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
|
5,289
|
22 Junio 2015, 19:46 pm
por fernandoprog1
|
|