Чтение табличных числовых данных в C ++ с минимальным количеством строк кода

0

Привыкший к простоте операций ввода-вывода на языках сценариев, таких как Python, R или Matlab, я обнаружил, что простые операции, такие как чтение табличных числовых данных в C++, излишне сложны.

Итак, мне интересно, что такое кратчайший фрагмент кода (не обязательно с библиотекой STD, другие библиотеки допускаются) в C++, который может читать произвольную большую числовую, разделенную вкладку, таблицу данных (floats) в формате, подходящем для более поздние математические манипуляции (статистика и т.д.)?

  • 0
    std::vector<float> data; float num; while(std::cin >> num) data.push_back(num);
  • 0
    Я думаю, ваш ответ, безусловно, правильный. Единственным недостатком является то, что я теряю структуру таблицы (доступ к столбцам / строкам), что очень жаль статистику, но технически, я думаю, вы ответили на вопрос так, как я его выразил. Можно всегда нарезать вектор потом ...
Теги:
io

2 ответа

1

Если вы хотите, чтобы ваши данные в большой 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>()));
}
  • 0
    Я на самом деле посмотрел на броненосца . В этом случае минимальный код кажется очень коротким ... arma::mat A ;A.load("data.dat") Но это не STD
0
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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню