Я хочу прочитать и анализировать текстовый файл в C ++ в общем порядке. Файл всегда выполнен из пар ключей, по одному на линию. Ключ шаблон, а также значение. Я предвидел ключ и значения всегда быть основным типом (INT, FLOAT, String).
Моя проблема в том, что я не знаю, как создать преобразование ключа или строка значения в правильный тип.
Я попробовал следующее:
template<class Key, class T> inline
void EventReportReader<Key, T>::validateFileFormat()
{
// Read file line by line and check that the first token is of type Key and the second one of type T
std::string line;
try {
boost::regex re( "(\\S+)\\s+(.*)" );
while( getline( inStream_, line ) ) {
boost::cmatch matches;
if( boost::regex_match( line.c_str(), matches, re ) ) {
std::cout << re << " matches " << line << std::endl;
std::cout << " 1st : " << matches[1] << "\n 2nd : " << matches[2] << std::endl;
// test types
Key *k = dynamic_cast<Key*>(&matches[1]);
T t = dynamic_cast<T>(matches[2]);
}
}
}
catch( boost::regex_error& e ) {
// todo problem with regular expression, abort
}
}
и использование этого метода следуют следующим образом:
// This in turn calls the method validateFileFormat
EventReportReader<float, int> reader( testFileName );
Результат
/home/vonhalle/dev/eventbasedreport/libs/event_based_report/eventreportreader.h:121:60 . :: sub_match & '(из типа' Const Struct Boost :: sub_match ') для типа float ' (цель не указатель или ссылка на класс) /home/vonhalle/dev/eventbasedreport/libs/event_based_report/eventreportreader.h:122:53: Ошибка: Не удается dynamic_cast 'matches.boost :: match_results :: Оператор [] с бидом = chang char *, allocator = std :: allocator >, Boost :: Match_Results :: Const_Reference = Const Boost :: sub_match & '(типа' Const Struction Boost :: sub_match ') Чтобы ввести «int» (цель не указатель или ссылка)
Как мне это сделать? Это даже возможно?
Редактировать:
Файл может выглядеть так, если шаблон
1.14 5
2.34 78
0.56 24
или это, если шаблон
23 asdf
45 2222
1 bbbb
edit2:
Заявление о проблеме выше, частично неверно. Ключ никогда не является строкой, значение может быть строкой. Следовательно, все, что до первого пространства является ключом, а остальное - это значение. Извините за эту ошибку.