c++ - File input not looping through file -


im taking input in text file called enemies.txt. there problem in print out first enemy in file.

here code:

void enemies :: loadenemies() {     string filename = "enemies\\enemies.txt";     ifstream infile(filename);     string garbage;     int loadenemyid;     string loadenemyname;     int loadenemystrength;     int loadexperiencegain;     string loadweapon;     string loadroom;     while(infile >> garbage >> garbage >> loadenemyid      >> garbage >> garbage >> garbage >> loadenemyname      >> garbage >> garbage >> loadenemystrength      >> garbage >> garbage >> garbage >> loadexperiencegain      >> garbage >> garbage >> garbage >> loadweapon      >> garbage >> garbage >> loadroom >> garbage)     {     cout << "enemy id: \t\t" << loadenemyid <<"\n";     cout << "enemy name: \t\t"<< loadenemyname << "\n";     cout << "enemy strength: \t"<< loadenemystrength << "\n";     cout << "experience gain: \t" << loadexperiencegain << "\n";     cout << "weapon: \t\t" << loadweapon << "\n";     cout << "room: \t\t\t" << loadroom << "\n";     int id = weapon.getweaponid();     int weight = weapon.getweight();     int damage = weapon.getdamage();     weapons w1 (id,loadweapon, weight,damage);     int roomid = room.getroomid();     string roomexits = room.getroomexits();     rooms r1 (roomid,loadroom, roomexits);     enemies e1 (loadenemyid,loadenemyname,loadenemystrength,loadexperiencegain,w1,r1);     enemieslist.append(e1);     } } 

enemies.txt

enemy id: 1. enemy name: wolves. enemy strength: 5. experience gain: 186. weapon name: claws. room name: 1.  enemy id: 2. enemy name: cave bear. enemy strength: 10. experience gain: 302. weapon name: claws. room name: 4.  enemy id: 3. enemy name: viking. enemy strength: 6. experience gain: 254. weapon name: longsword. room name: 0.  enemy id: 4. enemy name: criminal. enemy strength: 6. experience gain: 198. weapon name: war axe. room name: 0.  enemy id: 5. enemy name: ninja. enemy strength: 6. experience gain: 211. weapon name: katana. room name: 0.  enemy id: 6. enemy name: wild boar. enemy strength: 3. experience gain: 111. weapon name: claws. room name: 0. 

but funny thing have similar code weapons , works perfectly.

void weapons :: loadweapons()     {     string filename = "weapons\\weapons.txt";     ifstream infile(filename);     string garbage;     int loadweaponid;     string loadweaponname;     int loaddamage;     int loadweight;     while(infile >> garbage >> loadweaponid >> garbage >> garbage         >> garbage >> loadweaponname >> garbage >> loaddamage >> garbage         >> garbage >> loadweight >> garbage)     {         //cout << "weapon id: \t\t"<< loadweaponid<< "\n";         //cout << "weapon name: \t\t"<< loadweaponname << "\n";         //cout << "damage: \t\t" << loaddamage <<"\n";         //cout << "weight: \t\t" << loadweight << "\n";         weapons w1 (loadweaponid,loadweaponname,loaddamage,loadweight);         weaponslist.append(w1);     }     } 

weapons.txt id: 1. weapon name: katana. damage: 20. weight: 6.

id: 2. weapon name: longsword. damage: 17. weight: 9.  id: 3. weapon name: waraxe. damage: 22. weight: 20.  id: 4. weapon name: staff. damage: 9. weight: 6.  id: 5. weapon name: staff. damage: 3. weight: 0. 

in second , last enemy, have name consists of 2 words:

enemy name: cave bear. 

this messes parsing when tries read in strength on next line.

i recommend using different parsing method, getline , split, instead of trying abuse operator>>. way, can put whatever want on right side, , won't mess parsing.

edit:

also, reason, need remove last >> garbage parse, or won't work either. however, still recommend switch else, because fact strange thing happens shows how breakable is.


to getline , split-like parsing, this:

std::string line; while(std::getline(file, line)) {     std::stringstream ss(line);     std::string left, right;     std::getline(ss, left, ':'); // read until colon     std::getline(ss, right, '.'); // read until period     std::cout << left << ": " << right << std::endl; } 

Comments

Popular posts from this blog

linux - xterm copying to CLIPBOARD using copy-selection causes automatic updating of CLIPBOARD upon mouse selection -

c++ - qgraphicsview horizontal scrolling always has a vertical delta -