2013-05-09 60 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