Следующие ссылки, которые я использовал, помогли приблизиться к решению, однако я все еще испытываю ошибки чтения, памяти или зацикливания. Я перебираю лог-файл и извлекаю json. Перед запуском объектов json есть дата и время вместе с сообщением и идентификатором объекта, что соответствует json. Так что оба необходимы. Время также является фактором по мере роста файла журнала. Мне нужна помощь, чтобы выяснить, где я иду не так.
https://riptutorial.com/cplusplus/example/19029/string-streams
Регулярное выражение Multilines в C ++
https://www.codeproject.com/Questions/1221494/Simple-multiline-regex-in-Cplusplus
http://www.cplusplus.com/reference/iterator/next/
Stringstream c ++, в то время как цикл
Я могу использовать регулярные выражения в строке без проблем, и в качестве многострочного. Чтение из файла с использованием stringstream У меня есть while(input >> sstr.rdbuf());
, где мой поток теперь буферизован для моего понимания.
когда я cout << sstr.str()
читается только 1 раз
std::ifstream input("log.txt");
std::stringstream sstr;
std::smatch m;
std::regex reg("(\\{|\\[)(\\n\\s+.*)+\\n*(\\}||\\])");
while (input >> sstr.rdbuf());
std::string strang = sstr.str();
while (std::regex_search(strang, m, reg)) {
std::cout << "Results : \n" << m.str() << '\n';
for (i = 0; i < strang.length(); i++) {
std::cout << m.str(i);
i++;
}
}
Кажется, что файл зацикливается вечно, если файл маленький. Для больших файлов 30MB + нет вывода.
Я смотрю на векторы и хеш-карты, но я не уверен, как применить регулярное выражение к hashmap - кажется странным. Кроме того, я узнал, что векторы в любом случае хранят до 30 переменных, так что этот тип нагрузки слишком велик.
Спасибо!
Другая вариация
void PrintMatches(std::string str, std::regex reg) {
std::smatch matches;
std::cout << matches.size() << std::endl;
}
int main() {
std::ifstream input("log.txt");
std::stringstream sstr;
std::smatch m;
std::regex reg("(\\{|\\[)(\\n\\s+.*)+\\n*(\\}||\\])");
while (input >> sstr.rdbuf());
std::string str = sstr.str();
std::cout << str;
//PrintMatches(str, reg);
return 0;
}