2013-05-09 65 views
2

我从一个名为Enemies.txt的文本文件输入。但有一个问题,它只会打印文件中的第一个敌人。文件输入不通过文件循环

这里是我的代码:

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. 

但有趣的是,我有武器类似的代码和它完美的作品。

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. 武器名称:武士刀。 伤害:20 重量: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. 
+0

现在,我知道这不是严格C++,但为什么会这样可怕使用' fscanf'功能?阅读,使用和调试要容易得多......至少在我看来。无论如何,你在哪里阅读数据集之间的换行符?另外,你的敌人的名字有太多垃圾。实际上它只是两个“垃圾”,适用于所有数据点。 – 2013-05-09 23:08:54

+0

你的武器实际上可以正确计数。 – chris 2013-05-09 23:08:58

+0

@RefugnicEternium感谢您的建议。在这段时间结束时,infile >>垃圾读入敌人之间的界限...... – user2355394 2013-05-09 23:11:16

回答

4

在你的第二个和最后一个敌人,你有一个由两个单词的名称:

Enemy Name: Cave Bear. 

这打乱了解析,当它试图读下一行的实力。

我会推荐使用不同的解析方法,如getlinesplit,而不是试图滥用operator>>。这样,你可以在右侧放置任何你想要的东西,而且不会搞乱解析。

编辑:

而且,由于某些原因,你需要从剖析删除最后>> garbage,否则将不能工作。不过,我仍然强烈建议你切换到别的东西,因为这种奇怪的事情发生的事实表明它是多么容易被破坏。


getlinesplit式的解析,你会做这样的事:

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

也许不是'split',看看C++如何没有一个(虽然是Boost),但是从冒号到期间应该是有效的。 – chris 2013-05-09 23:12:54

+0

@NeedForSleep这是“洞穴熊”线,搞乱了他们的解析,而不是“野猪”系列(尽管这也是一个问题)。 – Xymostech 2013-05-09 23:13:43

+0

@chris嗯,你可以建立你自己的'分裂'功能......我同意。也许我会举一个例子...... – Xymostech 2013-05-09 23:14:20