首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文件输入不会循环通过文件

文件输入不会循环通过文件
EN

Stack Overflow用户
提问于 2013-05-10 07:05:54
回答 1查看 75关注 0票数 2

我从一个名为Enemies.txt的文本文件中获取输入。但有一个问题,因为它只会打印出文件中的第一个敌人。

下面是我的代码:

代码语言:javascript
复制
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

代码语言:javascript
复制
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.

但有趣的是,我对武器也有类似的代码,它工作得很好。

代码语言:javascript
复制
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。

代码语言:javascript
复制
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.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-10 07:10:43

在你的第二个也是最后一个敌人中,你有一个由两个单词组成的名字:

代码语言:javascript
复制
Enemy Name: Cave Bear.

当它试图读取下一行的强度时,这会使解析变得混乱。

我建议使用不同的解析方法,比如getlinesplit,而不是滥用operator>>。这样,您就可以将您想要的任何内容放在正确的位置,而不会搞乱解析。

编辑:

此外,由于某些原因,您需要从解析中删除最后一个>> garbage,否则它也不会工作。然而,我仍然强烈建议你换成其他的东西,因为这种奇怪的事情发生的事实表明它是多么容易崩溃。

要执行getlinesplit-like解析,您需要执行以下操作:

代码语言:javascript
复制
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;
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16472601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档