• Welcome to Valhalla Legends Archive.
 

Problems retrieving std::map values (CONFUSING!)

Started by warz, March 21, 2006, 11:13 PM

Previous topic - Next topic

warz

NOTE: I wrote this thread on another forum, which is why I'm real vague with this. I'm messing around with Skywing's flags union, trying to associate a username, with it's flag union.

This might be a little confusing. Bare with me. I've got a map declared like...


typedef std::map<std::string, UserAttributes> themap;
themap accessmap;


UserAttributes is a union containing a few structs, some functions to modifiy a dword (bitshifting), and the dword being modified. I read a username and an access 'level' from a text file of mine. I need the username to be the std::string value of the map, which is easy. While reading these values from the text file, I place the access level in a non-globally initialized UserAttributes variable. Then, I plug my username string, and the modified UserAttributes union into the map. My function for this is...


bool readdatabase(std::string filename) {
printchat(false, "Populating user map...");
std::ifstream database(filename.c_str());

if(!database.is_open())
return false;

std::string username, access;
while(!database.eof()) {
database >> username >> access;

UserAttributes accessmanip;
for(int x=0; x != access.length(); x++) {
accessmanip.Set(access[x]);
}
accessmap[username] = accessmanip;
}
database.close();

printchat(false, "OK!\n");
return true;
}


all this appears to be done with no errors. Now, my map should contain a list of usernames and their appropriate UserAttributes union, correct? I know it contains the usernames, because when I search the map for them they appear. I don't think the UserAttributes union, though, stays how I modified it when I put it into the map. When I use an iterator to extract the UserAttributes union out of the map, and then use my functions in the union to check the values of the bits that I set prior to placing them in the map, they don't seem to return what I am wanting. Here's how I'm checking the map's contents...


int main(int argc, char *argv[]) {
readdatabase("users.db");

themap::iterator iter = accessmap.begin();

while(iter != accessmap.end()) {
std::cout << (*iter).first << " has B flag? ";
UserAttributes accessmanip;
accessmanip = (*iter).second;

if(!accessmanip.Check('B'))
std::cout << "nope" << std::endl;
else
std::cout << "yes" << std::endl;

iter++;
}

return (0);
}


It's telling me that every user has the 'B' flag, when only one should have it. I geuss my main question is, when I modify my UserAttributes union, then put it in the map, does it retain all the information that it help before it was put in the map?

I guess if you see anything wrong, please point it out

Thanks

warz

Sovled. Before inserting the UserAttributes union into my map, I went ahead and initialized dwFlags to 0.