2014-11-02 3 views
0

Как я мог взять эту структуру и создать для нее 32 разных имени команды?Создание имен структур с использованием цикла for?

stucture для заполнения:

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

«Мне было интересно, могу ли я сделать что-то подобное» - это ...? –

+0

Почему бы не добавить 'std :: string' в структуру как член и сохранить там имя команды? А также используйте потоковые операторы вместо типа unsafe 'c'-style' fscanf'. – tillaert

+0

Ваша вторая строка формата fscanf неверна. – tillaert

ответ

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]); 
    } 
} 

Примечание: Если вы хотите использовать названия команд, то вы можете добавить новую строку в поле структуры, то вы можете назначить его после чтения из файла.

+0

Благодарим вас, а ваше примечание внизу – Trying2Learn

1

Вы не можете этого сделать, так как вы объявляете строку с именем name. Так что имя переменной уже существует, когда вы пытаетесь объявить команду.

Добавить вместо строки команду 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); 

    } 

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

Это обычно не наиболее эффективным способ сделать что-то (это может быть немного медленнее и использовать больше памяти, чем альтернативы), но это удобно, и производительность часто намного более чем достаточна.

Смежные вопросы