boolean function gives wrong answer

Hi all,

I have a problem with my boolean function check_gift. I have text file giftstore.txt containing a price and a gift on each line. I copied the file into a vector of structs. This is going ok, since I get to see the printed vector using show_giftstore.

Now I want to check for a certain item, if it is in the store. I took an item of the list to check, but my function gives the answer false back. What am I doing wrong?

Thank you alot!


#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cstdlib>
#include <string>
#include <cassert>
using namespace std;

typedef vector<string> Wishes;

int size(Wishes& w){ return static_cast<int>(w.size()); }


struct Wishlist
{
double budget;
Wishes wishes;
};


struct Gift
{
double price;
string name;
};

typedef vector<Gift> Giftstore;

int size(Giftstore& g) { return static_cast<int>(g.size()); }



void read_wishlist_into_struct(ifstream& infile, Wishlist& wishlist)
{
double b;
infile>>b;
wishlist.budget=b;

int i=0;
string name;
getline(infile,name);

while(infile)
{
wishlist.wishes.push_back(name);
i++;
getline(infile,name);
}
infile.close();
}


void show_wishlist(Wishlist wishlist)
{
cout<<"Budget: "<<wishlist.budget<<endl<<endl;
cout<<"Wishes: "<<endl;
for(int i=0; i<size(wishlist.wishes); i++)
{
cout<<wishlist.wishes[i]<<endl;
}
cout<<endl;
}



void read_giftstore_into_vector(ifstream& infile, Gift& gift, Giftstore& giftstore)
{
double p;
string name;
int i=0;
infile>>p;

while(infile)
{
gift.price=p;
getline(infile,name);
gift.name=name;

giftstore.push_back(gift);
i++;
infile>>p;
}
infile.close();
}

void show_giftstore(Giftstore giftstore)
{
cout<<"All possible gifts in giftstore: "<<endl<<endl;

for(int i=0; i<size(giftstore); i++)
{
cout<<giftstore[i].price<<"\t"<<giftstore[i].name<<endl;
}
cout<<endl;
}

bool check_gift(Giftstore giftstore, string giftname)
{
int i=0;

while(i<size(giftstore))
{
if(giftstore[i].name==giftname)
{
return true;
}
else
{
i++;
}
}
return false;
}


void clear(Wishlist& b)
{
b.budget=0;

while(!b.wishes.empty())
{
b.wishes.pop_back();
}
}

void copy(Wishlist a, Wishlist& b)
{
b.budget=a.budget;

for (int i=0; i<size(b.wishes); i++)
{
b.wishes.push_back(a.wishes[i]);
}
}



int main ()
{

ifstream infile2("giftstore.txt");


Gift gift;
Giftstore giftstore;

read_giftstore_into_vector(infile2, gift, giftstore);
show_giftstore(giftstore);



string giftname;
giftname=("dvd Up van Pixar");
bool x;

x=check_gift(giftstore, giftname);
cout<<"in store?: "<<x<<endl;


return 0;
}
Last edited on
I think the problem is that when you read the name using getline you also read all the white space characters that are between the price and the name. Try and see if removing all whitespaces before calling getline helps.
infile >> ws;
Topic archived. No new replies allowed.