web-dev-qa-db-fra.com

Pourquoi les éléments appariés sont-ils dans mon vecteur de sortie de vecteur faux?

Pour le contexte, je travaille sur un programme système de récompense pour un magasin. J'ai un fichier qui contient une liste d'éléments avec les points que le client gagne sous le nom de chaque article. Voici ce que le fichier contient:

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

J'essaie de lire dans le fichier en deux variables différentes, puis rangez ces variables dans un vecteur de paires. Mais j'ai remarqué que lorsque je sortirai les paires du vecteur, la première lettre de l'article est manquante et que les points sont complètement éteints. J'ai essayé de changer le point à un char au lieu d'un int, et a fait la même chose dans le vecteur couplé. Les deux donnent des sorties aussi inexactes/étranges. Qu'est-ce que je fais mal ici? Merci les gars. Voici la partie de mon programme où j'essaie de stocker les articles/points d'un vecteur couplé:

    int answer;
    int points;
    std::string tempName;
    std::string name;
    std::string item;
    std::ifstream inFS;
    std::vector<std::string> nameList;
    std::vector<std::pair<std::string, int>> pairedList;
    std::cout << "Would you like to add points to a member's name? If not, input 0 to look at other options!" << std::endl;
    std::cout<< "Otherwise, input 1 to continue to the point system." << std::endl;
    std::cin >> answer;
    if (answer == 0)
        options();
    if (answer == 1) {
        inFS.open("items.dat");
        if (inFS.is_open())
            std::cout << "File opened successfully." << std::endl;
        while (std::getline(inFS, item)) {
            inFS >> points;
            pairedList.Push_back(make_pair(item, points));
        }
        if (!inFS.eof())
            std::cout << "Not able to reach end of file" << std::endl;
        inFS.close();
        for (int i = 0; i < pairedList.size(); i++)
            std::cout << pairedList[i].first << " " << pairedList[i].second << std::endl;
        exit(1);
    }
} 
1
wawa

Essayez de changer le inFS >> points Pour une autre std::getline(inFS, points_str) (remarque que vous avez besoin d'un std::string points_str{};); Ensuite, vous pouvez faire une make_pair(item, std::stoi(points_str)). [Démo]

#include <iostream>  // cout
#include <string>  // getline, stoi

int main()
{
    std::string item{};
    std::string points{};
    while (std::getline(std::cin, item))
    {
        std::getline(std::cin, points);
        std::cout << "item = " << item << ", points = " << std::stoi(points) << "\n";
    }
}
1
rturrado