我需要将.txt
文件读入数组并将其存储在甲板中。 .txt
文件如下所示:
1 Dwarf 2 4
11 Armour 1
6 Wall 0 5
10 Sword 2
4 Bless 2 2
1 Cannon 4 1
1 Dwarf 2 4
1 Cannon 4 1
2 Fireball 3
1 Cannon 4 1
每行是:type
name
attack
和health
。
我只允许使用1类卡;也就是说,每种类型我都需要一个甲板。
我已经看过了,但是我正在努力寻找这个特定问题的答案。谁能用简单的英语向我指出正确的方向?
答案 0 :(得分:3)
让我们假设您的记录如下:
1 Dwarf 2 4
要在类中对此模型进行建模:
class Type_1_Card
{
int type;
std::string name;
int attack;
int health;
};
在建模中,您选择最适合数据列的类型和成员。
每行将是模型的一个实例。
说到行,每行都需要某种容器(也称为数据库)。由于行数在运行时是未知的,因此请使用std::vector
,因为它可以根据需要扩展。
std::vector<Type_1_Card> database;
为了遵守数据隐藏和封装的原则,我们将让类输入数据,因为该类知道布局(字段和成员)。 C ++允许重载运算符和方法,因此我们将重载一个熟悉的方法:operator>>
。
class Type_1_Card
{
// yada, yada, yada
public:
friend std::istream& operator>>(std::istream& input, Type_1_Card& card);
};
std::istream&
Type_1_Card ::
operator>>(std::istream& input, Type_1_Card& card)
{
input >> card.type;
input >> card.name;
input >> card.attack;
input >> card.health;
return input;
}
这通过允许在卡中读取以下代码来隐藏数据:
std::fstream data_file(/*...*/);
Type_1_Card card;
while (data_file >> card)
{
database.push_back(card);
}
神奇地,card
的内容没有公开,隐藏,并且功能被封装到类或对象中。
编辑1:扩展封装
在您的程序中,您可能需要按名称查找卡。您可以将方法添加到类中,然后搜索数据库:
class Type_1_Card
{
// yada, yada, yada
public:
bool is_card_name(const std::string& key_name) const
{
// Remember, comparison is case sensitive, 'A' != 'a'
return name == key_name;
}
};
这使您可以使用名称在数据库中搜索卡。
这是蛮力技术。有一些使用库函数的简单方法,但是还有待进一步研究。
const size_t index = 0U;
const size_t size = database.size();
for (index = 0; index < size; ++index)
{
if (database[index].is_card_name("Dwarf"))
{
std::cout << "Dwarf card found at index " << index << "\n";
}
}