2016-04-06 8 views
-3

Ich versuche, eine DFS-Suche auf einem bestimmten Diagramm mit dem folgenden Code zu tun:Ausgabe von Eingangs Lesen von 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); 
    } 

Der Eingang ist in der folgenden Form:

  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

Bitte konzentrieren sich auf die readstruct und readIndata Funktion, wo die Daten

gelesen und gespeichert wird. Ich beabsichtige, die beiden ersten Leitungen (13 und 13) und speichert diese

zwei Werte als Kanten und Scheitel num im ‚readstruct‘ Funktion zu lesen.

Nach Lese Zeile 1 und Zeile 2, die, wenn die Bedingung erfüllt ist, und geht aus

der Schleife.

Leitung 3 und die Leitung 15 sind in dem readIndata lesen, wenn i größer als 1

Da pro Zeile drei Daten enthält und Raum zwischen ihnen, I char Array verwendet

um sie zu speichern, und lesen Sie ein Zeichen mit einem Zeichen. Die Segmention Faul

Fehler zeigt an, wenn der Code zum Lesen der Datei, wenn es weiterhin Linie

15 erreicht (oder i = 13) in readIndata Funktion, wo es sollte stoppen. Also ich denke,

etwas mit filepointer oder fscanf Funktion versagt.

Beste

+0

Mischen Sie nicht C und C++ so. – LogicStuff

+0

Ok, aber ich frage mich, ob dies die Ursache des Problems ist – Sean

+0

Überprüfen Sie immer Rückgabewert von 'fscanf', so dass Sie sowohl EOF * und * Parse Fehler (wie versuchen, eine Zahl zu lesen, wenn es Text gibt). – hyde

Antwort

0

Sie müssen zuerst i in readstrct() initialisieren. Wie der Post jetzt liest, wird er als ein Index in das Integer-Array a verwendet.

+0

Ich habe versucht, aber das Problem besteht immer noch. – Sean

+0

@Sean, bitte aktualisieren Sie den Code in Ihrem Beitrag, um dies sowie alle anderen von Ihnen vorgenommenen Aktualisierungen zu berücksichtigen. Wenn das das Neueste anzeigt, das du getestet hast, und immer noch den Fehler bekommen habe, werde ich mich freuen, noch einmal zu schauen. – donjuedo