繁体   English   中英

c++ 结构向量和从文件中读取

[英]c++ vector of structs and reading from a file

所以,我有一个我正在读取的文件,其中包括球员姓名,然后是空格,后跟球队名称 [Christian_Ponder KC]。 为此,我制作了这个结构:

struct qb_info {
    string player;
    string team;
};

然后,在 main 中,我正在读取一个字符串向量中的所有内容: string str;

vector <string> players_and_team;
qb_info player_info;
vector <qb_info> player_data;

while(!data_file.eof()) {
     data_file >> str;
     players_and_team.push_back(str);
}

然后,如果索引是偶数,它将是一名球员,所以我调用结构并将其存储在球员中并将其推入结构的向量中,如果是奇数,它将是球队:

for(int i = 0; i < players_and_team.size(); i++) {
    if(i % 2 == 0) {
        player_info.player = players_and_team.at(i);
        player_data.push_back(player_info);
    } else {
        player_info.team = players_and_team.at(i);
        player_data.push_back(player_info);
    }
}

但是当我打印它时,所有内容都会打印两次:

for(int i = 0; i < player_data.size() / 2; i++) {
    cout << player_data.at(i).player << ",  " << player_data.at(i).team     << endl;
}

这是输出:

Aaron_Rodgers,  
Aaron_Rodgers,  GB
Alex_Smith,  GB
Alex_Smith,  KC
Andrew_Luck,  KC
Andrew_Luck,  IND
Andy_Dalton,  IND
Andy_Dalton,  CIN
Austin_Davis,  CIN
Austin_Davis,  STL
Ben_Roethlisberger,  STL
Ben_Roethlisberger,  PIT
Blaine_Gabbert,  PIT
Blaine_Gabbert,  SF
Blake_Bortles,  SF
Blake_Bortles,  JAC
Brandon_Weeden,  JAC
Brandon_Weeden,  DAL
Brian_Hoyer,  DAL
Brian_Hoyer,  CLE
Brock_Osweiler,  CLE
Brock_Osweiler,  DEN
Cam_Newton,  DEN
Cam_Newton,  CAR
Carson_Palmer,  CAR
Carson_Palmer,  ARI
Case_Keenum,  ARI
Case_Keenum,  HOU
Chad_Henne,  HOU
Chad_Henne,  JAC
Charlie_Whitehurst,  JAC
Charlie_Whitehurst,  TEN
Chase_Daniel,  TEN
Chase_Daniel,  KC
Christian_Ponder,  KC
Christian_Ponder,  MIN
Colin_Kaepernick,  MIN
Colin_Kaepernick,  SF
Colt_McCoy,  SF
Colt_McCoy,  WAS
Connor_Shaw,  WAS
Connor_Shaw,  CLE
Derek_Anderson,  CLE
Derek_Anderson,  CAR
Derek_Carr,  CAR
Derek_Carr,  OAK
Drew_Brees,  OAK
Drew_Brees,  NO
Drew_Stanton,  NO
Drew_Stanton,  ARI
EJ_Manuel,  ARI
EJ_Manuel,  BUF
Eli_Manning,  BUF
Eli_Manning,  NYG
Geno_Smith,  NYG
Geno_Smith,  NYJ
Aaron_Rodgers,  NYJ
Aaron_Rodgers,  GB
AJ_McCarron,  GB
AJ_McCarron,  CIN
Alex_Smith,  CIN
Alex_Smith,  KC
Alex_Tanney,  KC
Alex_Tanney,  TEN
Andrew_Luck,  TEN
Andrew_Luck,  IND
Andy_Dalton,  IND
Andy_Dalton,  CIN
Austin_Davis,  CIN
Austin_Davis,  CLE
B.J._Daniels,  CLE
B.J._Daniels,  HOU
Ben_Roethlisberger,  HOU
Ben_Roethlisberger,  PIT
Blaine_Gabbert,  PIT
Blaine_Gabbert,  SF
Blake_Bortles,  SF
Blake_Bortles,  JAC
Brandon_Weeden,  JAC
Brandon_Weeden,  HOU
Brian_Hoyer,  HOU
Brian_Hoyer,  HOU
Brock_Osweiler,  HOU
Brock_Osweiler,  DEN
Cam_Newton,  DEN
Cam_Newton,  CAR
Carson_Palmer,  CAR
Carson_Palmer,  ARI
Case_Keenum,  ARI
Case_Keenum,  STL
Charlie_Whitehurst,  STL
Charlie_Whitehurst,  IND
Chase_Daniel,  IND
Chase_Daniel,  KC
Colin_Kaepernick,  KC
Colin_Kaepernick,  SF
Colt_McCoy,  SF
Colt_McCoy,  WAS
Dan_Orlovsky,  WAS
Dan_Orlovsky,  DET
Derek_Anderson,  DET
Derek_Anderson,  CAR
Derek_Carr,  CAR
Derek_Carr,  OAK
Drew_Brees,  OAK
Drew_Brees,  NO
Drew_Stanton,  NO
Drew_Stanton,  ARI
EJ_Manuel,  ARI
EJ_Manuel,  BUF
Eli_Manning,  BUF
Eli_Manning,  NYG
Geno_Smith,  NYG
Geno_Smith,  NYJ

有人可以指出我做错了什么的正确方向吗?

这里发生的是你重用已经填充的qb_info player_info

首先插入“Aaron_Rodgers”并打印

亚伦_罗杰斯,

接下来将“GB”添加到 player_info

Aaron_Rodgers, GB

接下来保留“GB”并插入“Alex_Smith”

Alex_Smith, GB

接下来保留“Alex_Smith”并添加“KC”

Alex_Smith, KC

接下来保留“KC”并插入“...”,依此类推。


您可以接受@Someprogrammerdude 的建议并同时读取这两个值,这会将您的程序简化为

std::vector<qb_info> player_data;
qb_info player_info;
while (data_file >> player_info.player >> player_info.team) { 
    player_data.emplace_back(player_info);
}

然后可以在向量上的简单循环中完成打印

for (auto &i : player_data) {
    std::cout << i.player << ", " << i.team << '\n';
}

您想将具有两个成员的数据结构推送到您的向量中,您不能像那样分别分配玩家姓名和他们的团队,只有当您拥有两个值时,才应该将数据结构推回向量中:

for(int i = 0; i < players_and_team.size(); i++) {
    if(i % 2 == 0) {
        player_info.player = players_and_team.at(i);
         // here you don’t need to push back 
     } else {
        player_info.team = players_and_team.at(i);
        player_data.push_back(player_info);  // now you have both values of player_info to push into vector 
     }
  }

在这段代码中,player_info 拥有球员和球队数据后,将其推送到向量一次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM