#include <iostream>
#include <sstream>
#include <vector>
// example data that imitates real file
std::string example_data = R"([40, 12, 100, 3, 0.05 ,12 ,6]
[[3850.6, 1481, 592.4],
[4989.4, 1919, 767.6],
[3335.8, 1283, 513.2],
[5142.8, 1978, 791.2],
[5116.8, 1968, 787.2],
[4460.3, 1715.5, 686.2],
[3727.1, 1433.5, 573.4],
[3248.7, 1249.5, 499.8],
[4704.7, 1809.5, 723.8],
[3127.8, 1203, 481.2],
[3225.3, 1240.5, 496.2],
[3403.4, 1309, 523.6]])";
// extractor operator to read vector from stream
std::istream& operator>>(std::istream& is, std::vector<double>& vec)
{
//#1 - check if it starts from '['
char c;
is >> c;
if (c != '[')
throw std::runtime_error(std::string("Invalid character : ") + c +
" when parsing vector of double");
//#2 - get the line till ']'
std::string line;
if (!std::getline(is, line, ']'))
throw std::runtime_error("Error parsing vector of double");
//#3 - parse values inside '[' and ']'
std::istringstream lstr(line);
std::string value;
while (std::getline(lstr, value, ','))
vec.push_back(stod(value));
return is;
}
std::istream& operator>>(std::istream& is, std::vector<std::vector<double>>& m)
{
//#1 - check if it starts from '['
char c;
is >> c;
if (c != '[')
throw std::runtime_error(std::string("Invalid character : ") + c +
" when parsing matrix of double");
// parse matrix line-by-line
while(true)
{
std::vector<double> tmp;
is >> tmp;
m.push_back(std::move(tmp));
// if matrix finihed, c should contain ']', else - ','
is >> c;
if (c == ']')
return is;
if (c != ',')
throw std::runtime_error(std::string("Invalid character : ") + c +
" when parsing matrix of double");
}
}
// display vector
template<typename T>
std::ostream& operator<<(std::ostream& os, const std::vector<T>& t)
{
os << "[";
for (auto it = t.begin(); it != t.end(); ++it)
os << (it != t.begin() ? ", " : "") << *it;
os << "]";
return os;
}
int main()
{
// here you can use any std::istream
std::istringstream in(example_data);
std::vector<double> vec;
in >> vec;
std::cout << "Vector: " << vec << std::endl;
std::vector<std::vector<double>> m;
in >> m;
std::cout << "Matrix: " << m << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KCi8vIGV4YW1wbGUgZGF0YSB0aGF0IGltaXRhdGVzIHJlYWwgZmlsZQpzdGQ6OnN0cmluZyBleGFtcGxlX2RhdGEgPSBSIihbNDAsIDEyLCAxMDAsIDMsIDAuMDUgLDEyICw2XQoKW1szODUwLjYsIDE0ODEsIDU5Mi40XSwKWzQ5ODkuNCwgMTkxOSwgNzY3LjZdLApbMzMzNS44LCAxMjgzLCA1MTMuMl0sCls1MTQyLjgsIDE5NzgsIDc5MS4yXSwKWzUxMTYuOCwgMTk2OCwgNzg3LjJdLApbNDQ2MC4zLCAxNzE1LjUsIDY4Ni4yXSwKWzM3MjcuMSwgMTQzMy41LCA1NzMuNF0sClszMjQ4LjcsIDEyNDkuNSwgNDk5LjhdLApbNDcwNC43LCAxODA5LjUsIDcyMy44XSwKWzMxMjcuOCwgMTIwMywgNDgxLjJdLApbMzIyNS4zLCAxMjQwLjUsIDQ5Ni4yXSwKWzM0MDMuNCwgMTMwOSwgNTIzLjZdXSkiOwoKLy8gZXh0cmFjdG9yIG9wZXJhdG9yIHRvIHJlYWQgdmVjdG9yIGZyb20gc3RyZWFtCnN0ZDo6aXN0cmVhbSYgb3BlcmF0b3I+PihzdGQ6OmlzdHJlYW0mIGlzLCBzdGQ6OnZlY3Rvcjxkb3VibGU+JiB2ZWMpCnsKCS8vIzEgLSBjaGVjayBpZiBpdCBzdGFydHMgZnJvbSAnWycKCWNoYXIgYzsKCWlzID4+IGM7CglpZiAoYyAhPSAnWycpCgkJdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKHN0ZDo6c3RyaW5nKCJJbnZhbGlkIGNoYXJhY3RlciA6ICIpICsgYyArIAoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICIgd2hlbiBwYXJzaW5nIHZlY3RvciBvZiBkb3VibGUiKTsKCS8vIzIgLSBnZXQgdGhlIGxpbmUgdGlsbCAnXScKCXN0ZDo6c3RyaW5nIGxpbmU7CglpZiAoIXN0ZDo6Z2V0bGluZShpcywgbGluZSwgJ10nKSkKCQl0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIkVycm9yIHBhcnNpbmcgdmVjdG9yIG9mIGRvdWJsZSIpOwoKCS8vIzMgLSBwYXJzZSB2YWx1ZXMgaW5zaWRlICdbJyBhbmQgJ10nCglzdGQ6OmlzdHJpbmdzdHJlYW0gbHN0cihsaW5lKTsKCXN0ZDo6c3RyaW5nIHZhbHVlOwoJd2hpbGUgKHN0ZDo6Z2V0bGluZShsc3RyLCB2YWx1ZSwgJywnKSkKCQl2ZWMucHVzaF9iYWNrKHN0b2QodmFsdWUpKTsKCXJldHVybiBpczsKfQoKc3RkOjppc3RyZWFtJiBvcGVyYXRvcj4+KHN0ZDo6aXN0cmVhbSYgaXMsIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGRvdWJsZT4+JiBtKQp7CgkvLyMxIC0gY2hlY2sgaWYgaXQgc3RhcnRzIGZyb20gJ1snCgljaGFyIGM7CglpcyA+PiBjOwoJaWYgKGMgIT0gJ1snKQoJCXRocm93IHN0ZDo6cnVudGltZV9lcnJvcihzdGQ6OnN0cmluZygiSW52YWxpZCBjaGFyYWN0ZXIgOiAiKSArIGMgKyAKCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdoZW4gcGFyc2luZyBtYXRyaXggb2YgZG91YmxlIik7CiAgICAKICAgIC8vIHBhcnNlIG1hdHJpeCBsaW5lLWJ5LWxpbmUKICAgIHdoaWxlKHRydWUpCiAgICB7CgkgICAgc3RkOjp2ZWN0b3I8ZG91YmxlPiB0bXA7CgkgICAgaXMgPj4gdG1wOwoJICAgIG0ucHVzaF9iYWNrKHN0ZDo6bW92ZSh0bXApKTsKCSAgICAvLyBpZiBtYXRyaXggZmluaWhlZCwgYyBzaG91bGQgY29udGFpbiAnXScsIGVsc2UgLSAnLCcKCSAgICBpcyA+PiBjOwoJICAgIGlmIChjID09ICddJykKCSAgICAJcmV0dXJuIGlzOwoJICAgIGlmIChjICE9ICcsJykKCQkJdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKHN0ZDo6c3RyaW5nKCJJbnZhbGlkIGNoYXJhY3RlciA6ICIpICsgYyArIAoJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdoZW4gcGFyc2luZyBtYXRyaXggb2YgZG91YmxlIik7CiAgICB9Cn0KLy8gZGlzcGxheSB2ZWN0b3IKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+JiB0KQp7CglvcyA8PCAiWyI7Cglmb3IgKGF1dG8gaXQgPSB0LmJlZ2luKCk7IGl0ICE9IHQuZW5kKCk7ICsraXQpCgkJb3MgPDwgKGl0ICE9IHQuYmVnaW4oKSA/ICIsICIgOiAiIikgPDwgKml0OwoJb3MgPDwgIl0iOwoJcmV0dXJuIG9zOwp9CmludCBtYWluKCkgCnsKCS8vIGhlcmUgeW91IGNhbiB1c2UgYW55IHN0ZDo6aXN0cmVhbQoJc3RkOjppc3RyaW5nc3RyZWFtIGluKGV4YW1wbGVfZGF0YSk7CgkKCXN0ZDo6dmVjdG9yPGRvdWJsZT4gdmVjOwoJCglpbiA+PiB2ZWM7CgoJc3RkOjpjb3V0IDw8ICJWZWN0b3I6ICIgPDwgdmVjIDw8IHN0ZDo6ZW5kbDsKCQoJc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8ZG91YmxlPj4gbTsKCWluID4+IG07CgoJc3RkOjpjb3V0IDw8ICJNYXRyaXg6ICIgPDwgbSA8PCBzdGQ6OmVuZGw7CglyZXR1cm4gMDsKfQ==
Vector: [40, 12, 100, 3, 0.05, 12, 6]
Matrix: [[3850.6, 1481, 592.4], [4989.4, 1919, 767.6], [3335.8, 1283, 513.2], [5142.8, 1978, 791.2], [5116.8, 1968, 787.2], [4460.3, 1715.5, 686.2], [3727.1, 1433.5, 573.4], [3248.7, 1249.5, 499.8], [4704.7, 1809.5, 723.8], [3127.8, 1203, 481.2], [3225.3, 1240.5, 496.2], [3403.4, 1309, 523.6]]