es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué los elementos emparejados en mi vector están saliendo incorrectos?

Para contexto, estoy trabajando en un programa de sistema de recompensas para una tienda. Tengo un archivo que contiene una lista de artículos con los puntos que el cliente gana debajo del nombre de cada artículo. Esto es lo que contiene el archivo:

rolling papers
1
lighter
1
silicone pipe
5
glass pipe
8
water pipe
10

Estoy intentando leer del archivo en dos variables diferentes y luego almacenar esas variables en un vector de pares. Pero he notado que cuando imprimo los pares del vector falta la primera letra del artículo y los puntos están completamente equivocados. He intentado cambiar el punto a un char en lugar de un int, y hice lo mismo en el vector emparejado. Ambos dieron salidas inexactas/extravagantes de manera similar. ¿Qué estoy haciendo mal aquí? Gracias chicos. Aquí está la parte de mi programa donde intento almacenar los artículos/puntos en un vector emparejado:

int respuesta;
int puntos;
std::string tempNombre;
std::string nombre;
std::string articulo;
std::ifstream inFS;
std::vector<std::string> listaNombres;
std::vector<><std::string, int="">> listaEmparejada;
std::cout << "¿Te gustaría agregar puntos al nombre de un miembro? Si no, ¡ingresa 0 para ver otras opciones!" << std::endl;
std::cout << "De lo contrario, ingresa 1 para continuar con el sistema de puntos." << std::endl;
std::cin >> respuesta;
if (respuesta == 0)
    opciones();
if (respuesta == 1) {
    inFS.open("items.dat");
    if (inFS.is_open())
        std::cout << "Archivo abierto exitosamente." << std::endl;
    while (std::getline(inFS, articulo)) {
        inFS >> puntos;
        listaEmparejada.push_back(std::make_pair(articulo, puntos));
    }
    if (!inFS.eof())
        std::cout << "No se pudo llegar al final del archivo." << std::endl;
    inFS.close();
    for (int i = 0; i < listaEmparejada.size(); i++)
        std::cout << listaEmparejada[i].first << " " << listaEmparejada[i].second << std::endl;
    exit(1);
}

}</std::string,>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema aquí parece estar en cómo estás leyendo los datos del archivo. Cuando utilizas std::getline(), lee la línea completa, incluyendo cualquier carácter de espacio en blanco como espacios y tabulaciones al final de la línea. Por lo tanto, cuando intentas leer los puntos usando inFS >> points, en realidad estás leyendo el carácter de espacio en blanco al final de la línea anterior en lugar del entero deseado.

    Una solución potencial es utilizar una combinación de std::getline() y std::stringstream para analizar los datos correctamente. Aquí tienes un ejemplo de cómo puedes modificar tu código para lograr esto:

    //...
    while (std::getline(inFS, tempName)) {
        std::stringstream ss(tempName);
        ss >> name; // extraer el nombre del elemento
        ss >> points; // extraer los puntos correspondientes
        pairedList.push_back(std::make_pair(name, points)); // añadir la pareja nombre-puntos al vector
    }
    //...
    

    Con esta modificación, deberías poder leer correctamente los datos del archivo, almacenarlos en un vector emparejado y mostrarlos con precisión. ¡Espero que esto te ayude!

Comments are closed.