Как всегда, существует множество возможных решений. Я хотел бы показать еще один. Для этого используются более современные элементы C ++, в основном из библиотеки алгоритмов и итераторов.
Итак, что мы будем делать?
Сначала мы читаем каждую строку как std::string
в простом для l oop с std::getline
. Затем мы снова поместим строку в std::istringstream
, чтобы мы могли воспользоваться итератором C ++: std::istream_iterator
.
Этот итератор будет перебирать элементы в строке и извлекать все целые числа. Это похоже на вызов оператора экстрактора (>>) для всех элементов в строке.
Мы используем итератор в так называемом конструкторе диапазона в os a std::vector
. Этот вектор, созданный на месте, будет добавлен к данным описания. Таким образом, в результате мы получим вектор вектора типа int: 2-мерный вектор.
В целях отладки мы копируем каждую строку значений в std::cout
.
Обратите внимание что нам действительно нужно всего лишь несколько очень простых заявлений для выполнения задачи.
Пожалуйста, проверьте.
#include <iostream>
#include <string>
#include <algorithm>
#include <sstream>
#include <vector>
#include <iterator>
std::istringstream sourceFile{R"(8 4 4 6 1
8 4 4 6 2
8 4 4 6 3
8 4 4 6 4
8 4 4 6 5
8 4 4 6 6
8 4 4 6 7
8 4 4 6 8
11 4 4 6 3
15 11 13
7 2 1 4 4
9 4 3 9 9
8 2 1 5 4
10 1 2 3 4 6 1
6 1 1 2 5 3 2
13 1 1 2 10 3 8
11 2 11 10 7)"};
int main()
{
// Here we will store the resulting int values
std::vector<std::vector<int>> data{};
for (std::string line{}; std::getline(sourceFile, line); ) {
// Split the line into integers and add to target array
std::istringstream iss(line);
data.emplace_back(std::vector<int>(std::istream_iterator<int>(iss), {}));
}
// Now all data is in our vector of vector of int
// Show read data on screen
std::for_each(data.begin(), data.end(), [](const std::vector<int>& v){
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " ")); std::cout << "\n";});
return 0;
}
Пожалуйста, обратите внимание. У меня нет файлов на SO. Поэтому я использовал std::istringstream
в качестве входного потока. Конечно, вы можете обменять его на любой другой std::ftream