I implemented a solution to your problem (mainly for my own learning). It works as intended, but it feels a little long.
#include<string>
#include<fstream>
#include<sstream>
#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>
struct PlayerData {
std::string name;
int number;
int points;
};
std::ostream& operator<<(std::ostream& os, const PlayerData& p) {
os<<"Name: "<<p.name<<", Number: "<<p.number<<", Points: "<<p.points;
return os;
}
PlayerData parse(const std::string& line) {
PlayerData data;
std::stringstream ss(line);
std::vector<std::string> tokens;
std::copy(std::istream_iterator<std::string>(ss),
std::istream_iterator<std::string>(),
std::back_inserter<std::vector<std::string>>(tokens));
data.points = std::stoi(tokens.at(tokens.size() - 1));
data.number = std::stoi(tokens.at(tokens.size() - 2));
for(auto it=tokens.begin(); it!=tokens.end()-2; ++it) {
data.name.append(" ");
data.name.append(*it);
}
return data;
}
int main(int argc, char* argv[]) {
std::string line;
std::vector<PlayerData> players;
{
std::ifstream fp(argv[1], std::ios::in);
while(!fp.eof()) {
std::getline(fp, line);
if(line.size()>0) {
players.push_back(parse(line));
}
}
}
for(auto p:players) {
std::cout<<p<<std::endl;
}
return 0;
}
Compile a g ++ version that supports C ++ 11 (in my case gcc 4.7.2).
[Prompt] g++ -oparseline parseline.cpp -std=c++11 -O2
[Prompt] ./parseline players.txt
Name: Fernando Torres, Number: 9, Points: -29
Name: Cristiano Ronaldo, Number: 7, Points: 31
Name: Wayne Rooney, Number: 10, Points: 37
Name: Neymar, Number: 17, Points: 29
Name: Andres Iniesta, Number: 8, Points: 32
Name: Robin van Persie, Number: 19, Points: 20
Name: Lionel Messi, Number: 10, Points: 43
Name: Xavi Hernandez, Number: 6, Points: 36
Name: Mesut Özil, Number: 10, Points: 38
Name: Didier Drogba, Number: 10, Points: 35
Name: Fernando Torres, Number: 9, Points: 29
Name: Kaká, Number: 10, Points: 17
source
share