Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Buscar juego de palabras en un fichero con getline, find, etc

Estas en el tema de Buscar juego de palabras en un fichero con getline, find, etc en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 10/02/2012, 15:03
Avatar de 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
  #2 (permalink)  
Antiguo 11/02/2012, 14:31
Avatar de Der_Gregor  
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 9
Antigüedad: 12 años, 11 meses
Puntos: 0
Respuesta: Buscar juego de palabras en un fichero con getline, find, etc

Bueno, para quien le sea de utilidad y como siempre es bueno postear la solución, aquí esta: http://www.cplusplus.com/forum/general/61558/

Saludos.

Etiquetas: fichero, find, funcion, getline, juego, palabras, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:10.