Я думаю, что самым простым решением было бы немного испачкать руки, читая файл char за char.Я предлагаю вам хранить наборы в векторе векторов int
s (визуализируйте его как двумерный массив, матрицу, если хотите).
Если i-й набор пуст, то i-ый вектор тоже будет пустым.
В цикле, в котором вы будете анализировать символы, вы пропустите открывающие фигурные скобки и запятые.Вы будете делать то же самое для закрывающих фигурных скобок, за исключением того факта, что вам потребуется обновить индекс, что поможет нам обновить индексный вектор.
Когда мы на самом деле читаем цифру, вы можете преобразование символа в int .
Полный пример:
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int main(void) {
char ch;
fstream fin("test.txt", fstream::in);
if(!fin) {
cerr << "Something is wrong...! Exiting..." << endl;
return -1;
}
int N; // number of sets
fin >> N;
vector<vector<int> > v;
v.resize(N);
int i = 0;
while (fin >> ch) {
//cout << ch << endl;
if(ch == '{' || ch == ',')
continue;
if(ch == '}') {
i++;
continue;
}
v[i].push_back(ch - '0');
}
if(i == N) {
cout << "Parsing the file completed successfully." << endl;
} else {
cout << "Parsed only " << i << " sets, instead of " << N << endl;
}
for(size_t i = 0; i < v.size(); ++i) {
if(v[i].size() == 0)
cout << i + 1 << "-th set is empty\n";
else {
for(size_t j = 0; j < v[i].size(); ++j)
cout << v[i][j] << " ";
cout << endl;
}
}
return 0;
}
Вывод:
gsamaras @ aristotelis: / Storage / homes / gsamaras $g ++ main.cpp
gsamaras@aristotelis:/Storage/homes/gsamaras$ ./a.out
Parsing the file completed successfully.
5 2 3
1 5
3-th set is empty
4-th set is empty
3
6-th set is empty
7-th set is empty
Важное примечание: это должно послужить отправной точкой, поскольку оно не будет обрабатывать числа, содержащие более одной цифры.В этом случае вы будете читать до запятой или закрывающей фигурной скобки, чтобы убедиться, что вы прочитали все цифры чисел, затем преобразовали из строки в целое число и затем сохранили ее в соответствующем векторе.