2016-04-06 3 views
-3

Я пытаюсь сделать поиск DFS на данном графике, используя следующий код:Проблема чтения информации от fscanf

#include <iostream> 
    #include <cstring> 
    #include <cstdlib> 
    #include <cstdio> 
    #include <vector> 
    #include <queue> 

    typedef struct G{ 
     int vertex1; 
     int vertex2; 
     float num; 
    } graph; 

    typedef struct adj{ 
     std::vector<int> element; 
    }adj; 

    void dfs (int v, bool marked[], adj*p){ 
     marked[v]=true; 
     std::vector<int>::iterator i; 
     for (i=p[v].element.begin(); i!=p[v].element.end();i++){ 
      if (!marked[*i]){ 
      dfs(*i, marked, p); 
      } 
     } 
    } 

    void Search(adj*p, int*tvertex){ 
     bool *marked=new bool[*tvertex]; 
     for (int v=0; v<*tvertex; v++){ 
      marked[v]=false; 
      } 
     for (int v=0; v<*tvertex;v++){ 
      if (marked[v]==false){ 
      dfs(v, marked,p); 
      } 
     } 
    } 

    void buildadj(graph*g, adj*p, int * tvertex, int *edge){ 
     for (int e=0; e<*edge; e++){ 
      p[g[e].vertex1].element.push_back(g[e].vertex2); 
      p[g[e].vertex2].element.push_back(g[e].vertex1); 
     } 
    } 

    void readInData(FILE *fp, graph*g, int *tvertex) { 
     char buffer[500]; 
     char *token; 
     const char delimiters[] = " "; 
     int i; 
     int n; 
     memset(buffer, 0, 499); 
     for(i = 0;!feof(fp);) { 
      i++; 
      if (i>=2){ 
       fscanf(fp, " %[^\n]", buffer); 
       token = strtok(buffer, delimiters); 
       n = (int) atoi(token); 
       g[i-2].vertex1 = n; 
       g[i-2].vertex2 = (int) atoi(strtok(NULL, delimiters)); 
       g[i-2].num = (float)atof(strtok(NULL, delimiters)); 
      } 
      } 
    } 
    void readstrct(FILE *fp,int*edge, int*tvertex){ 
     int i; 
     int a[2]; 
     while (EOF!=fscanf(fp, "%d\n", &a[i])) { 
       i++;  
       if(i>=2){ 
       break; 
       } 
      } 
     *tvertex=a[0]; 
     *edge=a[1]; 
    } 

    void sendMessage() { 
     char message[200]; 
     sprintf(message, "Wrong Format\n"); 
     printf("%s", message); 
    } 
    int main(int argc, char * argv[]) { 
     FILE *fp; 
     int edge; 
     int tvertex; 
     if(argc < 2) { 
      printf("File not given\n"); 
      sendMessage(); 
      return 0; 
      } 
     fp=fopen(argv[1], "r"); 
     if(fp == NULL) { 
      printf("file not found\n"); 
      sendMessage(); 
      return 0; 
     } 
     readstrct(fp,&edge, &tvertex); 
     graph *g=new graph[edge]; 
     adj *p=new adj[tvertex]; 
     readInData(fp, g, &tvertex); 
     buildadj(g,p,&tvertex, &edge); 
     Search(p,&tvertex); 
    } 

вход имеет следующий вид:

  1. 0 5 2,1
  2. 4 3 2,3
  3. 0 1 3,2
  4. 9 12 4,2
  5. 6 4 5,1
  6. 5 4 2,2
  7. 0 2 0,2 ​​
  8. 11 12 0,22
  9. 9 10 0,22
  10. 0 6 0,22
  11. 7 8 0,22
  12. 9 11 0,22
  13. 5 3 0,22

Пожалуйста, сосредоточьтесь на функции readstruct и readIndata, где данные считываются

и сохранены. Я намерен прочитать первые две строки (13 и 13) и сохраняет эти

два значения в качестве ребер и вершин NUM в «readstruct» функции.

После считывания линии 1 и линии 2, если условие удовлетворяется, и выходит

петли.

линия 3 и линия 15 считываются в readIndata, когда я больше, чем 1

Поскольку за линией содержит три данных и пространство между ними, я использовал массив символов

для их хранения и читать один символ одним символом. Segmention Фауль

ошибка показывает, когда код продолжает читать файл, когда он пересечет линию

15 (или я = 13) в readIndata функции, где он должен остановиться. Поэтому я думаю, что

что-то перепуталось с функцией filepointer или fscanf.

Лучшие

+0

Не смешивайте C и C++. – LogicStuff

+0

Хорошо, но мне интересно, является ли это причиной проблемы. – Sean

+0

Всегда проверяйте возвращаемое значение 'fscanf' так, чтобы вы ловили ошибки EOF * и * parse (например, пытаясь прочитать число при наличии текста). – hyde

ответ

0

Вы должны сначала инициализировать i в readstrct(). Поскольку пост читается сейчас, он используется как индекс в целочисленном массиве, a.

+0

Я пробовал, но проблема все еще существует. – Sean

+0

@Sean, пожалуйста, обновите код в своем посте, чтобы отразить это, а также любые другие сделанные вами обновления. Когда это показывает последнее, что вы протестировали, и все еще получили ошибку, я буду рад снова посмотреть. – donjuedo