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
Post a Comment