#include "stats.h" #include #include #include // Constructor Stats::Stats(std::string file) { filePath = file; list.clear(); loadFromFile(); } // Destructor Stats::~Stats() { #ifndef DEBUG saveToFile(); #endif list.clear(); } // Añade una muerte a las estadisticas void Stats::addDeath(std::string name) { // Primero busca si ya hay una entrada con ese nombre const int index = findByName(name); if (index != -1) { list.at(index).died++; } // En caso contrario crea la entrada else { stats_t item; item.name = name; item.visited = 0; item.died = 1; list.push_back(item); } } // Añade una visita a las estadisticas void Stats::addVisit(std::string name) { // Primero busca si ya hay una entrada con ese nombre const int index = findByName(name); if (index != -1) { list.at(index).visited++; } // En caso contrario crea la entrada else { stats_t item; item.name = name; item.visited = 1; item.died = 0; list.push_back(item); } } // Busca una entrada en la lista por nombre int Stats::findByName(std::string name) { int i = 0; for (auto l : list) { if (l.name == name) { return i; } i++; } return -1; } // Carga las estadisticas desde un fichero bool Stats::loadFromFile() { // Indicador de éxito en la carga bool success = true; // Variables para manejar el fichero std::string line; std::ifstream file(filePath); // Si el fichero se puede abrir if (file.good()) { // Procesa el fichero linea a linea while (std::getline(file, line)) { // Comprueba que la linea no sea un comentario if (line.substr(0, 1) != "#") { stats_t stat; std::stringstream ss(line); std::string tmp; // Obtiene el nombre getline(ss, tmp, ';'); stat.name = tmp; // Obtiene las visitas getline(ss, tmp, ';'); stat.visited = std::stoi(tmp); // Obtiene las muertes getline(ss, tmp, ';'); stat.died = std::stoi(tmp); list.push_back(stat); } } // Cierra el fichero file.close(); } // El fichero no existe else { // Crea el fichero con los valores por defecto saveToFile(); } return success; } // Guarda las estadisticas en un fichero void Stats::saveToFile() { // Crea y abre el fichero de texto std::ofstream file(filePath); if (file.good()) { std::cout << filePath << " open for writing" << std::endl; } else { std::cout << filePath << " can't be opened" << std::endl; } // Escribe en el fichero file << "# NOMBRE DE LA HABITACION;VISITAS;MUERTES" << std::endl; for (auto item : list) { file << item.name << ";" << item.visited << ";" << item.died << std::endl; } // Cierra el fichero file.close(); }