Стои бросает invalid_argument - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь загрузить информацию из .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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...