Ver Mensaje Individual
  #1 (permalink)  
Antiguo 10/02/2012, 15:03
Avatar de Der_Gregor
Der_Gregor
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 9
Antigüedad: 12 años, 11 meses
Puntos: 0
Buscar juego de palabras en un fichero con getline, find, etc

Hola, muy buenas!!... Tengo una funcion que busca parrafos en un fichero y compara si dentro de ese parrafo concreto, existe la palabra que le especifico por consola. Hasta aqui funciona bien si le paso por ejemplo "Juan", el problema que tengo es que si le paso "Juan Perez Pares" debería solo devolverme los parrafos donde esta "Juan Perez Pares" y no "Juan" siempre cuidando que sea case-sensitive ya que no es lo mismo "Juan Perez Pares" que "juan perez pares" Debe ser la búsqueda exacta.. A continuación mi pequeña funcion..

Código:
string encontrarParrafos( istream &in ) {
	string buscarPalabra;
	string resultado, linea, resultadoMATCH;
	string::size_type posicion, found;
	const string LF("\n");
	const string CR("\r");
	const string PUNTO(".");
	const string ESPACIO(" ");
	const string NUL("\0");
	string whitespaces ("\r\n\v\f\t");
	bool EsParrafo;
	int numlinea=0, parrafo=0, parrafosMATCH=0;
	unsigned int lugar;
	
	buscarPalabra = palabrasABuscar(); // Otra funcion que pide palabra/as por consola

	while (getline( in, linea )) {
			EsParrafo = false;
			if (linea.empty()) {
				linea.clear();
			}
			found=linea.find_last_not_of(whitespaces);
			if (found!=string::npos)
				linea.erase(found+1);
			else {
				linea.clear(); 
			}
				
			posicion = linea.find_last_of(PUNTO);
			//cout << "PUNTO ENCONTRADO en el posicion " << posicion << endl; // Comprobacion
			if ((posicion != string::npos && linea.substr(posicion+1)==ESPACIO && linea.substr(posicion+2)==NUL) ||
				(posicion != string::npos && linea.substr(posicion+1)==ESPACIO && linea.substr(posicion+2)==CR)) {
				
				parrafo++;
				//cout << "Fin de parrafo encontrado en la linea: " << int(posicion ); // Comprobacion
				EsParrafo = true;
			} 
				
			if (EsParrafo){
				// Almacenar los parrafos en nuevas lineas "LF"
				resultado += linea +LF;
				lugar = resultado.find(buscarPalabra);
				if (lugar != string::npos) {
					parrafosMATCH++;
					//Almacenar solo los parrafos que cumplan con la busqueda
					resultadoMATCH += resultado; 
				}
				// Limpiar resultado para evitar duplicados
				resultado.clear();
			} else {
                                // Concatenar lineas que no tienen fin de parrrafo
				resultado += linea +ESPACIO;
				resultado.erase( resultado.length() -1 );
			}
		numlinea++;
	}
		cout << " ===================================== " << endl;
		cout << "+Numero total de lineas analizadas: " << numlinea << endl;
		cout << "+Numero total de parrafos: " << parrafo << endl;
		cout << "+Parrafos que contienen la busqueda: " << parrafosMATCH << endl;
		cout << " ===================================== " << endl;
	return resultadoMATCH;
}
La funcion cumple el rol de encontrar parrafos pero me cuenta igual "Juan" que "Juan Perez" osea que solo toma la 1era palabra ingresada..

Agradezco cualquier luz