2016-12-07 3 views
-1

Мне дан файл как таковой, instance10_002. Я пытаюсь сохранить точки данных MST в структуру, которую я создал. Из моих отладочных команд printf я вижу, что я успешно выполнил итерацию через файл и достиг своих точек данных MST.Increment sscanf() в цикле do..while и хранить строки в структуре

Вот мой код:

void collect_edges(char filename[31]) 
{ 

    int counter = 0, check = 0; 
    char c, str[64]; 
    int index; 
    input_file = fopen(filename, "r"); 
    if (input_file == NULL) 
    { 
     printf("Input file does not exist\n"); 
     exit(1); 
    } 

    while (fgets(str, 64, input_file)) 
    { 
     c = str[0]; 
     if (c != '#' && c != '\n') 
     { 
      counter++; 
      printf("Check for counter\n"); 
      if (counter == 2) 
      { 
       printf("Check Check\n"); 
       sscanf(str, "%d", &num_pt); 
       printf("Check for counter 2\n"); 
       index = num_pt + 3; 
      } 


      if (counter == (index)) 
      { 
       printf("Check for counter 13\n"); 
       printf("Counter is: %d\n", counter); 
       do { 
       sscanf(str, "%d %d %d", &points[counter-index].parent, &points[counter-index].x, &points[counter-index].distance_to_tree); 
       check++; 
       counter++; 
       } while (check <= num_pt - 2); 
       break; 
      } 
     } 
    } 
    fclose(input_file); 

} 

Я использовал do..while петли для хранения всех точек данных MST в мои структуры, но когда я иду к ним доступ, он печатает 0 9 45, который 0th index моей структуры, а не правильные данные для всех индексов.

Выход по следующему методу:

collect_edges(argv[inputfile]); 
printf("%d\n", points[3].parent); 
printf("%d\n", points[3].x); 
printf("%d\n", points[3].distance_to_tree); 

Output

правильный вывод, как показано в файле экземпляра:

Первоначально я думал, что мой счетчик не увеличивается в моем do..while циклах, но я включил приращение, и теперь он сканирует первую строку данных MST и сохраняет ее во всех индексах структуры. Есть ли способ увеличить функцию sscanf для увеличения и сканирования всех остальных линий точек данных?

ответ

0

ОБНОВЛЕНИЕ: Я РЕШЕН МОУ ПРОБЛЕМУ!

Делать больше исследований, я обнаружил, что лучше использовать fscanf вместо sscanf в моем do..while цикле, как fscanf использует входную FileStream. Поэтому мне не нужно создавать цикл для дальнейшей итерации каждой строки, как и для sscanf.

При изменении моего кода в соответствии с fscanf моя программа дает правильный результат.

Также мне пришлось с твердым приращением my counter, чтобы получить правильные показатели. Следующее также можно сделать, оставив counter таким же и жестким декрементом вместо index.

Изменена структура кода:

if (counter == (index)) 
    { 
    printf("Check for counter 13\n"); 
    printf("Counter is: %d\n", counter); 
    do { 
     fscanf(input_file, "%d %d %d", &points[(counter + 1)-index].parent, &points[(counter + 1)-index].x, &points[(counter+1)-index].distance_to_tree); 
     check++; 
     counter++; 
    } while (check <= num_pt - 2); 
    break; 

выход после выполнения следующего:

collect_edges(argv[inputfile]); 
printf("%d\n", points[3].parent); 
printf("%d\n", points[3].x); 
printf("%d\n", points[3].distance_to_tree); 

Corrected Output