2013-05-09 6 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. 

그러나 재미있는 것은 내가 무기 유사한 코드를 가지고 있고 그것을 완벽하게 작동합니다. 1. 무기 이름 : 카타나 ID Weapons.txt

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); 
    } 
    } 

. 피해 : 20 무게 :

Enemy Name: Cave Bear. 

가하려고 할 때이 구문 분석을 망쳐 놨 : 두 번째와 마지막 적을 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'-function? 최소한 제 의견으로는 읽고 사용하고 디버그하는 것이 더 쉽습니다. 어쨌든, 당신은 어디에서 데이터 집합 사이의 개행을 읽고 있습니까? 게다가 적 이름에 쓰레기가 너무 많습니다. 실제로 그것은 모든 데이터 포인트에 대해 단지 두 가지 '쓰레기'입니다. –

+0

무기가 실제로 올바르게 계산됩니다. – chris

+0

@RefugnicEternium 조언을 주셔서 감사합니다. 끝에있는 infile >> 쓰레기는 적들 사이의 줄을 읽습니다. ... – user2355394

답변

4

, 당신은 두 단어로 구성되어 이름이 다음 줄에서 힘을 읽으십시오.

operator>>을 남용하려고 시도하는 대신 getlinesplit과 같은 다른 구문 분석 방법을 사용하는 것이 좋습니다. 그렇게하면 오른쪽에 원하는 것을 넣을 수 있으며 파싱을 망칠 필요가 없습니다.

편집 : 또한

가, 어떤 이유로, 당신은 구문 분석에서 마지막 >> garbage를 제거해야하거나 중 하나가 작동하지 않습니다. 그러나이 이상한 일이 발생한다는 사실이 얼마나 쉽게 파손될 수 있는지 보여주기 때문에 나는 다른 곳으로 전환 할 것을 강력히 권장합니다.


getlinesplit -like 구문 분석을 수행하려면, 당신은 같은 것을 할 것입니다 :

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

C++에 (부스트가 있지만) C++이없는 방법으로 보일 수도 있지만 콜론에서 기간으로 이동해야합니다. – chris

+0

@NeedForSleep 그것은 "야생 멧돼지"가 아니라 파싱을 엉망으로 만드는 "동굴 베어"선입니다 (물론 그 역시 문제가 될 수 있습니다). – Xymostech

+0

@chris 글쎄, 당신은 자신 만의'split' 기능을 만들 수 있습니다 ... 나는 동의합니다. 어쩌면 내가 예를 들어 ... – Xymostech

관련 문제