C ++ txt文件逐行字符串和数组转换为纸牌游戏的int

时间:2018-08-12 15:08:28

标签: c++ arrays file readline

我需要将.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 attackhealth

我只允许使用1类卡;也就是说,每种类型我都需要一个甲板。

我已经看过了,但是我正在努力寻找这个特定问题的答案。谁能用简单的英语向我指出正确的方向?

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