Я пытаюсь загрузить информацию из .txt (где каждая строка является объектом с параметрами с;). Но когда я читаю .txt, некоторые параметры должны быть int. Поэтому я пытаюсь преобразовать строку в int с помощью stoi, получаю исключение invalid_argument.
У меня есть 3 файла с информацией, которые необходимо загрузить в начале программы, но «Itinerarios.txt» не загружается. Я пытался изменить метод преобразования и инициализации параметров ранее. Я использовал стои раньше без проблем.
void EcoCityMoto::leeItinerarios(string fileNameItinerarios) {
ifstream fe; //Flujo de entrada
string linea; //Cada línea tiene un itinerario
int total = 0; //Contador de líneas o itinerarios
//Variables auxiliares para almacenar los valores leídos
string id, dia, mes, anio, hora, minutos, minutos2, cliente, moto, latitud, longitud;
double dlat, dlon;
//Asociamos el flujo al fichero
fe.open(fileNameItinerarios);
if (fe.good()) {
//Mientras no se haya llegado al final del fichero
while (!fe.eof()) {
getline(fe, linea); //Toma una línea del fichero
stringstream ss; //Stream que trabaja sobre buffer interno
if (linea != "") {
++total;
}
if (total > 1) {
//Inicializamos el contenido de ss
ss << linea;
//Leemos el id
getline(ss, id, ';'); //El carácter ; se lee y se elimina de ss
//Leemos el di
getline(ss, dia, ';'); //El caráter ; se lee y se elimina de ss
//Leemos el mes
getline(ss, mes, ';'); //El caráter ; se lee y se elimina de ss
//Leemos el año
getline(ss, anio, ';'); //El caráter ; se lee y se elimina de ss
//Leemos la hora
getline(ss, hora, ';'); //El caráter ; se lee y se elimina de ss
//Leemos los minutos
getline(ss, minutos, ';'); //El caráter ; se lee y se elimina de ss
//Creamos la fecha
int auxDia = stoi(dia), auxMes = stoi(mes), auxAnio = stoi(anio), auxHora = stoi(hora), auxMinutos = stoi(minutos);
Fecha fechaAux(auxDia, auxMes, auxAnio, auxHora, auxMinutos);
//Leemos los minutos del itinerario
getline(ss, minutos2, ';'); //El caráter ; se lee y se elimina de ss
//Leemos la latitud y longitud de inicio
getline(ss, latitud, ';'); //El caráter ; se lee y se elimina de ss
getline(ss, longitud, ';'); //El caráter ; se lee y se elimina de ss
dlat = stod(latitud);
dlon = stod(longitud);
UTM inicio(dlat, dlon);
//Leemos la latitud y longitud de fin
getline(ss, latitud, ';'); //El caráter ; se lee y se elimina de ss
getline(ss, longitud, ';'); //El caráter ; se lee y se elimina de ss
dlat = stod(latitud);
dlon = stod(longitud);
UTM fin(dlat, dlon);
//Leemos el dni del cliente
getline(ss, cliente, ';'); //El caráter ; se lee y se elimina de ss
//Buscamos el cliente
Cliente *aux;
std::map<std::string, Cliente>::iterator i = clientes.find(cliente);
if (i != clientes.end()) {
aux = &(*i).second;
}
//Leemos la matricula de la moto
getline(ss, moto, ';'); //El caráter ; se lee y se elimina de ss
//Buscamos la moto
Moto *motoAux = 0;
for (int i = 0; i < motos.size(); i++) {
if (motos[i].getId() == moto) {
motoAux = &motos[i];
break;
}
}
//Creamos el itinerario
int auxId = stoi(id), auxMinutos2 = stoi(minutos2);
Itinerario itinerario(auxId, inicio, fin, fechaAux, auxMinutos2, motoAux);
//Lo almacenamos en el lciente correspondiente
(*i).second.getItinerario().push_back(itinerario);
cout << "leido itinerario " << total << " " << endl;
}
}
cout << "Total de itinerarios en el fichero: " << total << endl;
fe.close(); //Cerramos el flujo de entrada
} else {
cerr << "No se puede abrir el fichero de itinerarios" << endl;
UTM mini(0, 0);
UTM maxi(100, 110);
for (std::map<std::string, Cliente>::iterator it = clientes.begin(); it != clientes.end(); ++it) {
(*it).second.crearItinerarios(1, idUltimo, mini, maxi);
idUltimo += 1;
}
cout << "Creado itinerarios!!!!!!!!!!!!!" << endl;
}
}
Каждый раз, когда я пытаюсь запустить программу, я получаю недопустимый аргумент из стои, но я не пытаюсь преобразовать что-то вроде "123123ABC" в int. Ожидаемый результат - каждая строка .txt, созданная как объект.
Весь код и .txt можно найти здесь: https://github.com/mamechapa2/EEDD_Practica4_2019/tree/develop