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.Código [Seleccionar]
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:
Código [Seleccionar]
#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.