文件输入没有遍历文件
File input not looping through file
我从一个名为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: tt" << loadEnemyID <<"n";
cout << "Enemy Name: tt"<< loadEnemyName << "n";
cout << "Enemy Strength: t"<< loadEnemyStrength << "n";
cout << "Experience Gain: t" << loadExperienceGain << "n";
cout << "Weapon: tt" << loadWeapon << "n";
cout << "Room: ttt" << 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: tt"<< loadWeaponID<< "n";
//cout << "Weapon Name: tt"<< loadWeaponName << "n";
//cout << "Damage: tt" << loadDamage <<"n";
//cout << "Weight: tt" << loadWeight << "n";
Weapons w1 (loadWeaponID,loadWeaponName,loadDamage,loadWeight);
weaponsList.Append(w1);
}
}
Weapons.txtID: 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.
在你的第二个也是最后一个敌人中,你有一个由两个词组成的名字:
Enemy Name: Cave Bear.
当它试图读入下一行的强度时,这会使解析混乱。
我建议使用不同的解析方法,如getline
和split
,而不是试图滥用operator>>
。这样,你就可以把任何你想要的放到右边,而不会弄乱解析。
另外,由于某种原因,您需要从解析中删除最后一个>> garbage
,否则它也无法工作。然而,我仍然强烈建议你换一种别的东西,因为这种奇怪的事情发生的事实表明它是多么容易被打破。
要执行类似getline
和split
的解析,您可以这样做:
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;
}
相关文章:
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 遍历顺序由 std::文件系统directory_iterator给出
- 如何遍历几个每小时一次的根(.root)文件,并将它们组合成更大的每日数据.root文件?
- 遍历对象向量,并找到与从文本文件中提取的对象匹配的变量
- 我该如何循环遍历我的数组(缓冲区——包含一个文本文件),并将其打印成30字节的块
- 从带有 std::ifstream::read() 的文件中读取 int 遍历 char * 二进制数据
- 使用 stdin 读取文本文件,然后遍历多个数组
- 是否可以遍历文本文件行并使用字符串流来解析每一行
- clang ast访问者,避免遍历文件
- 遍历指定文件夹的目录?Qt 和 c++
- 遍历目录中两个文件对
- 在qt中遍历文件夹中的文件非常慢
- 如何使用QDirIterator只遍历特定类型的文件
- C++遍历目录中的文件并写入其他目录
- 如何遍历当前目录并将文件存储在数组中?Bash 外壳脚本
- 有没有办法以编程方式遍历头文件
- 遍历文件夹中的文件(C++)
- 垂直遍历文件
- 遍历文件时跳过最后K行
- istream_iterator,用于遍历二进制文件中的字节