[英]Saving a vector of Structs into a file and reading a vector of structs from a file in 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.