Вы можете сделать что-то вроде этого:
std::string line;
std::map<std::string, std::string> props;
std::ifstream file("foo.txt");
while(std::getline(file, line)) {
std::string token;
std::istringstream tokens(line);
while(tokens >> token) {
std::size_t pos = token.find('=');
if(pos != std::string::npos) {
props[token.substr(0, pos)] = token.substr(pos + 1);
}
}
/* work with those keys/values by doing properties["name"] */
Line l(props["pc"], props["ct"], ...);
/* clear the map for the next line */
props.clear();
}
Я надеюсь, что это полезно. Строка может быть такой:
struct Line {
std::string pc, ct;
Line(std::string const& pc, std::string const& ct):pc(pc), ct(ct) {
}
};
теперь это работает, только если разделитель - пробел. Вы также можете заставить его работать с другими разделителями. изменить
while(tokens >> token) {
Например, если вы хотите использовать точку с запятой:
while(std::getline(tokens, token, ';')) {
на самом деле, похоже, у вас есть только целые числа в качестве значений и пробелы в качестве разделителей. Вы можете изменить
std::string token;
std::istringstream tokens(line);
while(tokens >> token) {
std::size_t pos = token.find('=');
if(pos != std::string::npos) {
props[token.substr(0, pos)] = token.substr(pos + 1);
}
}
в это тогда:
int value;
std::string key;
std::istringstream tokens(line);
while(tokens >> std::ws && std::getline(tokens, key, '=') &&
tokens >> std::ws >> value) {
props[key] = value;
}
std::ws
просто ест пробел. Вы должны изменить тип реквизита на
std::map<std::string, int> props;
тогда тоже, и заставьте Line принимать int вместо std :: string's. Я надеюсь, что это не слишком много информации сразу.