Site hosted by Angelfire.com: Build your free website today!

// buscador.cpp

 

/** \file  buscador.cpp

    \brief Posee la implementación de la clase buscador

                    

*/

 

#include "buscador.h"

#include <iostream>

 

using std::cout;

using std::endl;

 

// ¿Tiene l linea un arroba?

bool buscador::hayArroba(){

            string linea2 = get_linea();

            bool resultado = false;

            int indice = linea2.find("@");

            if (indice != string::npos) {

                        resultado = true;

            }

            return resultado;

}  // Hat arroba

 

 

/// Analiza la hilera que está al lado derecho de una arroba

void buscador::analizar_derecho() {

            string temp1 = get_derecho();

            string temp2 = "";

 

            string::const_iterator iter = temp1.begin();

            string::const_iterator d_arroba = temp1.begin();

            ++d_arroba;

 

            if (*d_arroba != ' ' && isalpha(*d_arroba)){

                while (!(isspace(*iter)) && !(isdigit(*iter)) && *iter != ',' && *iter != '>') {

                        // iter sea diferente de espacio

                            temp2 += *iter;

                            iter++;

                        }

                set_derecho(temp2);

            } else {

        set_derecho("$");

            }

}  // Analizar derecho

 

 

/// Analiza la hilera que está al lado izquierdo de una arroba

void buscador::analizar_izquierdo() {

            string temp1 = get_izquierdo();

            string temp2 = "";

            string::reverse_iterator iter = temp1.rbegin();

            string::reverse_iterator a_arroba = temp1.rbegin();

            if (isalpha(*a_arroba) || isdigit(*a_arroba) || (*a_arroba == '_')){

                while (!(isspace(*iter)) && *iter != '<' && (isalpha(*iter) || isdigit(*iter) || *iter == '_')) {

                            temp2 = *iter + temp2;

                            iter++;

                        }

                set_izquierdo(temp2);

            } else {

        set_izquierdo("$");

            }

 

} // Analizar izquierdo

 

// EOF: buscador.cpp

 

 

 

// buscador.h

 

/** \file  buscador.h

    \brief Es una clase que se encarga de buscar direcciones de correo

                   electrónico dentro de /c Strings

                    

*/

 

#ifndef Man

#define Man

#include <fstream>

#include <string>

#include <cctype>

 

using std::string;

using std::ifstream;

 

class buscador{

            private:

                        string linea; ///< Linea

        string l_derecho; ///< Lado derecho del arroba

        string l_izquierdo; ///< Lado izquierdo del arroba

            public:

 

                        buscador() {linea = "";}; ///< Constructor por defecto

                        void analizar_derecho();  ///< Analiza el lado derecho del arroba

                        void analizar_izquierdo(); ///< Analiza el lado izquierdo del arroba

                        bool hayArroba(); ///< Retorna true si encuentra una "@" en la hilera

 

                        /// Actualiza la linea que va a ser procesada

                        void set_linea( const string& l) { linea = l; }

                        /// Actualiza el lado derecho de la arroba

                        void set_derecho(const string& derecho) { l_derecho = derecho; }

                        /// Actualiza el lado izquierda de la arroba

                        void set_izquierdo(const string& izquierdo) { l_izquierdo = izquierdo; }

           

 

                        /// Retorna la linea

                        string& get_linea() { return linea; }

                        /// Retorna el lado izquierdo del arroba

                        string& get_izquierdo() { return l_izquierdo; }

        /// Retorna el lado derecho del arroba

                        string& get_derecho() { return l_derecho; }

 

                        }; // Clase buscador

 

#endif

 

// EOF: buscador.h

 

 

// director.cpp 

 

/** \mainpage

 

    \section Tarea5 Buscador de Correos Electrónicos

 

    Este programa busca en un archivo de texto direcciones de

            correos electrónicos, y las guarda en un contenedor.

            Además lleva el registro de todos los reglones en los que

            esa dirección aparece.

 

 

    \Author

            - Manuel Marín Mora

    - Diego Vargas Arce          

    \date    2005

 

*/

 

#include "buscador.h"

#include "list_email.h"

#include <iostream>

#include <climits>

#include <string>

 

using std::cin;

using std::cout;

using std::endl;

using std::string;

 

 

/// Función que lleva el control del programa

void buscar(char*, buscador&);

 

/// Función principal en la que empieza la ejecución del programa

int main() {

 

            buscador B;

            buscar("prueba.txt", B);

           

    return 0;

} // main()

 

 

/**

    Es una función que lleva el control del programa.De ella

            se llaman a los principales métodos y funciones

*/

void buscar(char* fuente, buscador& B){       

            list_email Listota; // Listota de correos y reglones

            ifstream entrada2;  

            entrada2.open(fuente);

            string linea2 = B.get_linea(); // Linea en proceso

            string correo = ""; // Correo completo

            string::const_iterator iterador;

            int contador;

            char aux;

// El ciclo termina cuando se llega al fin de archivo

            while(!(entrada2.eof())) {

                        aux = entrada2.get(); // Extrae un caracter del archivo

                        if (aux != '\n' && !(entrada2.eof()) ) {

                        // !(fin de linea o fin de archivo)

                                   linea2 += aux;

                        } else {

                        // Fin de linea o fin de archivo

                                   B.set_linea(linea2);

                                   if (B.hayArroba()) {

                                   // Procesa solo las lineas que tienen al menos una arroba

                                               iterador = linea2.begin();

                                               contador = 0;

                        while (iterador != linea2.end()){

                                               // Mientras sea diferente del fin de linea2 

                                    if (*iterador == '@') {

                                                           // Si iterdor es = a arroba, verifica si el lado

                                                           // izquierdo y derecho forman parte de un correo

                       

                                                                       B.set_izquierdo(linea2.substr(0, contador));

                                                                       B.analizar_izquierdo();

                                               B.set_derecho(iterador);

                                                                       B.analizar_derecho();

                                                                       if (B.get_derecho() != "$" && B.get_izquierdo() != "$") {

                                                                       // Si izquierdo y derecho forman parte de un

                                                                       // correo, lo insertan en la lista

                                                                                  correo = B.get_izquierdo() + B.get_derecho();

                                                                                  Listota.agregar_email(correo, B.get_linea());

                                                                       }

                                                           }

                                    ++iterador;

                                                           ++contador;

                                               } 

                                      

                                   }

                                   linea2.erase();

                        }

 

            }

           

            cout << Listota << endl; // imprime la lista completa de correos y reglones

}

 

 

 

// EOF: director.cpp

 

 

 

// email.h

 

/** \file  email.h

    \brief Tiene una dierección de correo electronico y todos los

                   reglones en los que este aparece

                    

*/

 

 

#include <list>

#include <string>

#include <iostream>

 

using std::list;

using std::string;

using std::cout;

using std::cin;

using std::endl;

using std::ostream;

 

class email{

 

public:

            email() : m_LR(0) { m_email = ""; } ///< Constructor de vector

            email(const email& LO): m_LR(0) {*this = LO;} ///< Constructor de copia

            /// Constructor a partir  de dos strings

    email(const string& correo, const string& reglon) {

                        m_email = correo; m_LR.push_back(reglon);

            }

    ~email() {} ///< Destructor

 

    /// Operador ==(email, string)

            friend bool operator==( const email& E, const string& S );

            /// Operador ==(string, email)

            friend bool operator==( const string& S,const email& E );

            /// Operador <<

            friend std::ostream& operator<<(std::ostream& COUT, const email& E);

    friend class list_email;

 

private:

            list<string> m_LR;///< Reglones en los que aparece la dirección de correo     

            string m_email; ///< Dirección de correo 

 

}; // Clase email

 

 

///  Operador ==(string, email)

inline bool operator==( const email& E, const string& S ) {

            return E.m_email == S;

}  //  Operador ==

 

///  Operador ==(string, email)

inline bool operator==( const string& S,const email& E ) {

            return E == S;

}  //  Operador ==

 

/**  Operador <<

     Retorna un flujo de salida con la dirección de correo

     y todos los reglones en los que este aparece

*/

inline std::ostream& operator<<(std::ostream& COUT, const email& E) {

            COUT << endl << E.m_email;

    std::list<string>::const_iterator iter = E.m_LR.begin();

            std::list<string>::const_iterator end = E.m_LR.end();

            for (; iter != end; ++iter ) {;

                        COUT << endl << "- " << *iter;

            }

    return COUT;

} // Operatodor <<

// EOF: email.h

// list_email.cpp

 

/**

    \file  list_email.cpp

    \brief Posee la implementación de la clase /c list_email

                    

*/

 

#include "list_email.h"

 

/**

    Inserta a "correo" como una dirección de correo electrónico, si

            "correo" ya está ya está en el contenedor, solo agrega el reglón

            en el que fue encontrado

*/

void list_email::agregar_email(const string& correo, const string& reglon){

            std::list<email>::iterator p = miembro(correo);

            if ( p == m_LLE.end()) { /// Si "correo" no ha sido insertado antes

                        email E(correo, reglon);

                        m_LLE.push_back(E);

            } else {

                        // Si correo ya fue insertado antes inserta solo el reglón

                        p->m_LR.push_back(reglon);

            }

 

}  // agregar_email()

 

/**

    Retorna la dirección en la que está el email /c "correo" dentro

            del contenedor.

            Si "correo" no está en el contenedor, miembro retorna la posición

    que sigue a la última

*/

std::list<email>::iterator& list_email::miembro(const string& correo) {

            return find(m_LLE.begin(), m_LLE.end(), correo);

} // miembro

 

 

// EOF: list_email.cpp

 

 

// list_email.h

 

/** \file  list_email.h

    \brief Usa la lista STL para almacenar direcciones de correo electronicas

*/

 

#include "email.h"

#include <list>

#include <algorithm>

using std::list;

using std::find;

 

class list_email{

 

public:

            list_email(): m_LLE(0) {} ///< Constructor de vector

            /// Constructor de copia

            list_email(const list_email& LO): m_LLE(0) { *this = LO; }

    ~list_email() {} ///< Destructor

 

            /// Inserta una dirección en el contenedor

            void agregar_email(const string& correo, const string& reglon);

    /// Miembro devuelve la dirección de "correo"

            std::list<email>::iterator& miembro(const string& correo);

            /// Operador <<

 

            friend std::ostream& operator<<(std::ostream& COUT, const list_email& L);

 

private:

     list<email> m_LLE; ///< Lista de correos electrónicos

 

};  // Clase list_email

 

/// Retorna un ostream con todos los correos y sus respactivos reglones

inline std::ostream& operator<<(std::ostream& COUT, const list_email& L) {

    std::list<email>::const_iterator iter = L.m_LLE.begin();

            std::list<email>::const_iterator end = L.m_LLE.end();

            for (; iter != end; ++iter ){

                        COUT << endl;

                        COUT << "**************************************************" ;

                        COUT << endl << (*iter);

            }

    return COUT;

} // Operatodor <<

 

// EOF: list_email.h

 

 

Prueba.txt

 

 

Para carlos@ucr.ac.cr de manuel@intel.com.cr carlos@h.ucr

diegova16@gmail.com gsethyhjgyhik''¡'

aaaaaaaaaaaaaaaaaaaaaa@ sds@efe

yyyyyy diegova16@hotmail.com xxxxxx

adf@ rfwef  @dfac

 

atorres@ic-itcr.ac.cr     @fgdgdf      rtgferyjjjjjjjjjjjjj

adolfo@dimare.com

yyyyyy diegova16@hotmail.com xxx @ xxx

zzzzz diegova16@hotmail.com xxxxxx

aaaaaaaaaaaaaaaaaaaaaa

 

acacac@dffveev

 

Hola, te envío de nuevo mi dirección koenraad_lecot@ecci.ucr.ac.cr porque ya la habías pedido

No hemos sabido si el señor Lecot, koenraad_lecot@ecci.ucr.ac.cr, ha comezado su

"Koenraad Lecot" <koenraad_lecot@ecci.ucr.ac.cr>

)(/&%%&%$•%$&%(/=)/(/%/&...- koenraad_lecot@ecci.ucr.ac.cr ----99(()/(/&/&%/

 

atorres@ic-itcr.ac.cr

 

dsfffffffffffffffffffffffffffffffffffffffffffff%&%6rivendel@yahoo.es, rtrtetge