X-Git-Url: https://git.llucax.com/z.facultad/75.29/susanita.git/blobdiff_plain/a86e26ae42584c979262de7f6ddefa815ac7c625..9544fcaa595b6a6f14b86768429c1883fa39ec6d:/src/parser.cpp?ds=sidebyside diff --git a/src/parser.cpp b/src/parser.cpp index f15b9c7..c4453cc 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -16,11 +16,20 @@ Parser(Susanita& s): namespace { /// Saca espacios de una palabra - std::string strip(std::string s) - { - std::istringstream ss(s); - ss >> s; - return s; + std::string strip(std::string s) { + std::string ws = " \t\n"; + int first = s.find_first_not_of(ws); + int last = s.find_last_not_of(ws); + + if (first == -1) { + int pos_first = s.find_first_of(ws); + if (pos_first == -1) { + return s; + } else { + return std::string(""); + } + } + return s.substr(first,last-first+1).c_str(); } /// Devuelve palabra hasta el caracter indicado @@ -41,6 +50,9 @@ input(const std::string& filename) return false; Persona::sexo_type sexo = Persona::M; Persona::sexo_type opuesto = Persona::F; + + Susanita::size_type cap = get_n(filename); + std::string l; while (std::getline(f, l)) { @@ -59,21 +71,27 @@ input(const std::string& filename) Persona* pp = susanita.get_persona(nombre); if (!pp) { - pp = new Persona(nombre, sexo); + pp = new Persona(nombre, sexo, cap); susanita.add_persona(pp); } - Persona::prefs_type prefs; + int count = 0; while (ss) { std::string nombre = get_hasta(ss, ','); + nombre = strip(nombre); + if (nombre.empty()) { + continue; + } Persona* ppp = susanita.get_persona(nombre); if (!ppp) { - ppp = new Persona(nombre, opuesto); + ppp = new Persona(nombre, opuesto, cap); susanita.add_persona(ppp); } pp->prefs.push_back(ppp); + pp->prefs_hash[ppp->nombre] = count; + count++; } } return true; @@ -102,3 +120,27 @@ output() const } } +/// Hack medio feo para obtener el N del problema +Susanita::size_type +Parser:: +get_n(const std::string& filename) +{ + std::ifstream f(filename.c_str()); + if (!f) + return 0; + std::string l; + if (!std::getline(f, l)) + return 0; + std::istringstream ss(strip(l)); + // descartamos el nombre + get_hasta(ss, ':'); + // contamos personas en la lista + Susanita::size_type count = 0; + while (ss) + { + if (!strip(get_hasta(ss, ',')).empty()) + ++count; + } + return count; +} +