使用for循环创建结构名称?

时间:2014-11-02 22:04:23

标签: c++ data-structures

我如何采用这种结构并为其创建32个不同的团队名称?

要填充的结构:

typedef struct team{
    int stats[4];
}Team;

这是文本文件:

patriots 300 200 500 200
rams 200 340 230 300
cardinals 300 200 450 150
...

实例化32个Team的实例似乎是多余的,例如:

Team patriots;
Team rams;
Team cardinals;
...

如何创建这些实例,以便我可以通过名称识别它们?

(请参阅代码段中的最后评论,看看我哪里出错了)

int main(int argc, char* argv[]){

    int i = 0;
    int j = 0;

    FILE* file = fopen(argv[1], "r");

    for(i = 0 ; i < 32 ; i++){

        // Read the name
        string name;
        fscanf(file, "%s", name)

        // Create an instance of Team by its name
        /* PROBLEM : Obviously this does not work, 
                     how to name a variable as this? */
        Team name;

        for(j = 0 ; j < 4 ; j++){
            fscanf(file, "r", &name.stats[j]);
        }
    }
}

3 个答案:

答案 0 :(得分:2)

您可能还需要考虑std::mapstd::unordered_map来保存您的数据。

这些允许您从名称(例如Rams)映射到某些相关数据(在您的情况下为统计数据)。

std::map<std::string, team> data;

这允许您(例如)将data视为由字符串索引的数组,因此您可以执行以下操作:

std::string team_name;
team temp_team;

std::cin >> team_name >> temp_team;

data[team_name] = temp_team;

这通常不是有效的做事方式(它可能有点慢,并且使用的内存比替代方案多)但它方便且性能通常很高绰绰有余。

答案 1 :(得分:1)

您正好处于人们需要Array的位置。

创建一个长度为32的数组。

Team teams[32];

然后:

for(i = 0 ; i < 32 ; i++){
    string name;
    fscanf(file, "%s", name);
    for(j = 0 ; j < 4 ; j++){
        fscanf(file, "%d", &teams[i].stats[j]);
    }
}

注意:如果你想使用团队名称,那么你可以在结构中添加一个新的字符串字段,然后你可以在从文件中读取后分配它。

答案 2 :(得分:1)

由于您要声明名为name的字符串,因此无法执行此操作。因此,当您尝试声明团队时,变量名已存在。

将一个字符串添加到对象Team,然后将该文件中的名称写入Team的实例。

由于你有三十个团队,所以创建一个矢量来容纳所有团队。

你也可以将Team :: stats创建为一个向量,这样你就可以拥有不同数量的每个团队的分数(以后可能会延长它与该分数的日期以及他们对抗的团队)。

typedef struct team
{
    std::string name;
    int stats[4];
} Team;

int main(int argc, char* argv[])
{

    std::vector<Team> teams;

    int i = 0;
    int j = 0;

    FILE* file = fopen(argv[1], "r");

    for(i = 0 ; i < 32 ; i++)
    {

        Team team;

        fscanf(file, "%s", team.name)

        for(j = 0 ; j < 4 ; j++)
            fscanf(file, "r", team.stats[j]);

        teams.push_back( team );

    }

}