2014-12-13 2 views
0

Итак, я хочу подсчитать элементы на строке из входного файла .dat; у меня есть сотни строк, и я хочу сохранить данные в двухмерном векторе или массиве, поэтому я хочу выяснить, сколько «столбцов» должно иметь массив.Подсчет элементов на линии

Мои текущие мысли: возьмите только одну строку, установите ее с помощью какого-либо счетчика в цикле и пройдите до конца линии, а затем просто нажмите значение, сохраненное счетчиком, как переменную и инициализировать массив и что угодно, но есть ли более элегантное решение? Мне просто кажется, что это очень много кода, что для меня кажется очень простым, но я не смог найти ничего лучше, чем искать.

+0

Так что ваша цель поместить каждую строку в массив/вектор – 0x499602D2

ответ

1

Роллинг с двухмерным вектором (предполагается, что это означает std::vector<std::vector<double> >, и в предположении, что данные обычно хорошо сформированы (т. Е. Прямоугольная матрица находится в файле), я просто проанализирую файл linewise в векторы и бросать проверку после этого, если все строки имеют одинаковую длину. В этом случае вам не нужно выдумывать экстенты матрицы перед распределением памяти, потому что каждая строка получает свою собственную часть памяти. что-то вроде этого:?..

#include <algorithm> 
#include <fstream> 
#include <iterator> 
#include <sstream> 
#include <stdexcept> 
#include <string> 
#include <vector> 

std::vector<std::vector<double> > parse_file(std::istream &in) { 
    std::string line; 
    // istringstream is something you feed a string to read from it like you 
    // would from a file or std::cin. 
    std::istringstream parser; 
    std::vector<std::vector<double>> result; 

    while(std::getline(in, line)) { 
    parser.clear(); 
    parser.str(line); 

    // read stuff into a vector at the end of the vector vector. The 
    // istream_iterators make this easy by making the stringstream accessible 
    // like a range of doubles.  
    result.emplace_back(std::istream_iterator<double>(parser), 
         std::istream_iterator<double>( )); 
    } 

    // check if there are two lines in the matrix that don't have the same 
    // length. That would probably be bad. If that would not be bad, omit this. 
    if(std::adjacent_find(result.begin(), 
         result.end(), 
         [](std::vector<double> const &lhs, 
          std::vector<double> const &rhs) { 
          return lhs.size() != rhs.size(); 
         }) != result.end()) { 
    throw std::logic_error("Input file does not contain a rectangular matrix"); 
    } 

    return result; 
} 

... 

std::ifstream in("foo.dat"); 
auto matrix = parse_file(in); 
+0

ха-ха, это выглядит здорово Спасибо это неправильно называть это 2D вектор или любой другой – Verlet64

+0

нет, не incorre? кт. Просто этот термин неоднозначен - он может также означать плоский вектор, который вы адресуете определенным образом, например (это зеркальное отображение двухмерных массивов). – Wintermute

+0

Понял. Спасибо за помощь снова. – Verlet64

Смежные вопросы