There are multiple ways of doing it. You could read it into a string and process it manually based on spaces. Or you could use stringstream
to extract numerical values into array/vector
. That however, still requires you to remove the name before you do it.
Here is a little code that reads the file content into an unordered_map
which is essentially a dictionary
as defined in other languages.
void read_file(const std::string& path) {
std::ifstream in(path); // file stream to read file
std::unordered_map<std::string, std::vector<double>> map;
/*
* map structure to hold data, you do not have to use this.
* I am using it only for demonstration purposes.
* map takes string (name) as KEY and vector<double> as VALUE
* so given a NAME you can get the corresponding grades VECTOR
* i.e.: map["Johnson"] --> [85, 83, 77, 91, 76]
*/
std::string line;
while (std::getline(in, line)) { // read entire line
if (line == "") continue; // ignore empty lines
int last_alpha_idx = 0; // name ends when last alphabetic is encountered
for (size_t i = 0; i < line.size(); i++)
if (std::isalpha(line[i])) last_alpha_idx = i; // get index of last alpha
std::string name = line.substr(0, last_alpha_idx + 1); // name is from index 0 to last_alpha_idx inclusive (hence +1)
std::string numbers = line.substr(last_alpha_idx + 1); // array values the rest of the line after the name
std::stringstream ss(numbers); // this is an easy way to convert whitespace delimated string to array of numbers
double value;
while (ss >> value) // each iteration stops after whitespace is encountered
map[name].push_back(value);
}
}
You could read it into an array, the code will not change dramatically. I chose string
as KEY and vector<double>
as VALUE to form KEY/VALUE pairs for the dictionary (map).
As you can see in the code, it looks for the last alphabetic character in each line and takes its index to extract the name from the read line. Then it takes the rest of the string (just the numbers) and puts them into a stringstream
which will extract each number individually in its inner loop.
Note: the code above supports having full names (e.g. "Johnson Smith 85 83 77 91 76").