2015-05-06 3 views
0

Я просто пытаюсь прочитать данные из файла в вектор. Файл, как показано на изображении, я пытаюсь прочитать из содержит первое число (n), которое является числом узлов. После этого я прочитал n чисел веса. Наконец, я получаю соединение из матрицы смежности. Когда я компилирую свой код, он перестает работать.C++ пытается прочитать данные из файла в вектор

int main() 
{ 
    ifstream inFile; 
    string tline; 

    inFile.open("Problem.dat_50_50_0"); 

    if(!inFile) 
     cout << "OPSS" << endl; 

    inFile >> tline; 
    inFile >> n; 

    for(int i = 0; i < 2 * (n + 1); i++) 
     inFile >> tline; 

    vector<vector<int> > matrix(n, vector<int>(n)); 
    vector<list<int> > adj(n); 
    vector<int> weight(n); 
    vector<int> degree(n); 
    vector<string> color(n, white); 

    for(int i = 0; i < n; i++) 
    { 
     inFile >> weight[i]; 
     weight.push_back(weight[i]); 
    } 

    inFile >> tline; 

    for(int i = 0; i < n; i++) 
     for(int j = 0; j < n; j++) 
     { 
      inFile >> matrix[i][j]; 

      if(i == j) 
       matrix[i][j] = 0; 
      if(matrix[i][j] == 1) 
       adj[i].push_back(j); 
     } 
} 

Я пытаюсь открыть файл, чтобы прочитать первую строку, поместите этот номер в n, а затем push_back в векторе n й номер после первой строки (которая представляет собой вес, как показано в картина). После прочтения веса мы переходим к матрице, чтобы получить соседей. Если matrix[i][j] == 1, мы помещаем значение j в вектор смежности.

Например, согласно изображениям, вектор прил будет выглядеть примерно так:

0 -> 1, 2 
1 -> 0, 2, 3 
2 -> 0, 1 
3 -> 1 
+0

Прочитайте множество примеров по адресу: [StackOverflow C++ read file vector] (https://www.google.com/search?q=stackoverflow+c%2B%2B+read+file+vector+structure&ie= utf-8 & oe = utf-8) –

+0

Картинка не отображается (мне кажется, вам нужно больше репутации, чтобы прикрепить ее здесь), и ошибка, которую вы получаете, не ясна: она хотя бы компилируется? И тогда у вас есть ошибка времени выполнения? Вы пробовали какую-то базовую отладку, чтобы понять, где она падает? –

ответ

0

Этот блок выглядит неправильно:

for(int i =0; i < n ; i++){ 
    inFile>> weight[i]; 
    weight.push_back(weight[i]); 
} 

Вы принимаете число от inFile и положить его в weight[i], а затем, на следующей строке, вы push_back то же значение снова, но тогда вы будете переписывать его на следующая итерация (потому что i увеличилось в то же время). Это означает, что если ваши цифры, поступающие из файла, равны 1 2 3 4, вы получите эти результаты в конце каждой итерации: 1 1, 1 2 2, 1 2 3 3, 1 2 3 4 4. inFile>> weight[i]; достаточно.

Тогда, я не думаю, что это проблема, которая блокирует вас, но ...

if(! inFile){ 
    cout << "OPSS" << endl; 
} 

Если вы не можете прочитать файл, вы должны не только печатать «ОПСС», вы должен выйти или выбросить исключение. Во всяком случае, вы не можете просто продолжать, потому что остальная часть кода ожидает, что файл будет там.

1

Почему бы вам не написать данные, как это ?: 4;12,2365,85;6,11,12,8; Намного проще разделить и разобрать ..

Или используйте name=value list ..

Надеюсь, это поможет. Просто, как я знаю это лучше всего.

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