Привыкший к простоте операций ввода-вывода на языках сценариев, таких как Python, R или Matlab, я обнаружил, что простые операции, такие как чтение табличных числовых данных в C++, излишне сложны.
Итак, мне интересно, что такое кратчайший фрагмент кода (не обязательно с библиотекой STD, другие библиотеки допускаются) в C++, который может читать произвольную большую числовую, разделенную вкладку, таблицу данных (floats) в формате, подходящем для более поздние математические манипуляции (статистика и т.д.)?
Если вы хотите, чтобы ваши данные в большой 2D-матрице, к которой вы можете получить доступ, используя индексы строк и столбцов, я предпочитаю подход stringstream и istream_iterator.
vector<vector<double>> data;
ifstream is("path\to\your\file.txt");
for (string row; getline(is, row); ) {
stringstream ss(row);
data.push_back(vector<double>(istream_iterator<double>(ss), istream_iterator<double>()));
}
arma::mat A ;A.load("data.dat")
Но это не STD
struct Record {
int f1;
float f2;
char f3[20];
};
std::vector<Record> recs;
for (string line; getline(cin, line); ) {
Record rec;
if (3 == sscanf(line.c_str(), "%d,%f,%20s", &rec.f1, &rec.f2, &rec.f3)) {
recs.push_back(rec);
}
}
Если вам нужен полностью общий вектор-строка, вы можете посмотреть Boost для его строкового алгоритма split() и передать в свой разделитель. Я предпочитаю структурированный подход, когда это возможно.
Другой способ - позволить Python выполнять эту работу: вы можете встроить интерпретатор Python в свою C++ программу и использовать что-то вроде numpy.loadtxt()
для загрузки данных в массив NumPy, а затем получить доступ к нему из C++. Я делаю скорее обратную операцию: https://github.com/jzwinck/pccl/blob/master/NumPyArray.hpp
std::vector<float> data; float num; while(std::cin >> num) data.push_back(num);