извлечь из струнного потока в 2D вектор

Это может быть глупый вопрос, но в любом случае:
Я хотел бы получить числа из файла .txt, который содержит матрицу смежности графа, первая строка файла содержит только количество узлов.

10

-1 5 3 -1 -1 -1 -1 -1 -1 -1

5 -1 -1 4 -1 -1 -1 -1 -1 -1

3 -1 -1 -1 -1 9 7 6 -1 -1

-1 4 -1 -1 2 -1 -1 -1 -1 -1

-1 -1 -1 2 -1 -1 -1 -1 -1 -1

-1 -1 9 -1 -1 -1 -1 -1 -1 -1

-1 -1 7 -1 -1 -1 -1 -1 4 2

-1 -1 6 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 -1 -1 -1 4 -1 -1 -1

-1 -1 -1 -1 -1 -1 2 -1 -1 -1

почему это не работает правильно? вывод следующий:

10

10 0 0 0 0 0 0 0 0 0

5 0 0 0 0 0 0 0 0 0

3 0 0 0 0 0 0 0 0 0

-1 0 0 0 0 0 0 0 0 0

-1 0 0 0 0 0 0 0 0 0

-1 0 0 0 0 0 0 0 0 0

-1 0 0 0 0 0 0 0 0 0

-1 0 0 0 0 0 0 0 0 0

-1 0 0 0 0 0 0 0 0 0

-1 0 0 0 0 0 0 0 0 0

void beolvas (vector<vector<double> > & mygraph, string filename)
{
ifstream input(filename);
stringstream ss;
char node[30];
char graph_size[2];

while(input.good()){

input.getline(graph_size,'\n');
cout << graph_size << endl;
ss << graph_size;
int graph_sizeINT = atoi(graph_size);
mygraph.resize(graph_sizeINT, vector<double>(graph_sizeINT,-1));
ss.clear();

for(int i=0; i<graph_sizeINT; i++)
{

input.getline(node,35,'\n');
//cout << node << endl;
ss << node;
for(int j= 0; j<graph_sizeINT; j++)
{
ss.getline(node,' ');
//cout << node << " ";
mygraph[i][j] = atof(node);
cout << mygraph[i][j] << " ";
}
cout << endl;
ss << "";
ss.clear();
}
} input.close();   }

Спасибо за любой совет!

1

Решение

Ты используешь getline а также stringstream, которые являются хорошими инструментами, но не подходящими инструментами для этой работы; они слишком сильны и требуют слишком много внимания. Вместо того, чтобы точно анализировать, как они идут не так, посмотрите, что происходит, когда мы обходимся с ними, в пользу потокового ввода:

void beolvas (vector<vector<double> > & mygraph, string filename)
{
ifstream input(filename.c_str());

int graph_sizeINT;
while(input >> graph_sizeINT)
{
cout << graph_sizeINT << endl;

mygraph.resize(graph_sizeINT, vector<double>(graph_sizeINT,-1));

for(int i=0; i<graph_sizeINT; i++)
{
char node[30];
for(int j= 0; j<graph_sizeINT; j++)
{
input >> mygraph[i][j];
cout << mygraph[i][j] << " ";
}
cout << endl;
}
}
input.close();
}
0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector