我如何采用这种结构并为其创建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]);
}
}
}
答案 0 :(得分:2)
您可能还需要考虑std::map
或std::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 );
}
}