2014-11-24 5 views
0

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

-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

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

-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(); } 

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

ответ

0

Вы используете 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(); 
}