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:
- 0 5 2,1
- 4 3 2,3
- 0 1 3,2
- 9 12 4,2
- 6 4 5,1
- 5 4 2,2
- 0 2 0,2
- 11 12 0,22
- 9 10 0,22
- 0 6 0,22
- 7 8 0,22
- 9 11 0,22
- 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
Mischen Sie nicht C und C++ so. – LogicStuff
Ok, aber ich frage mich, ob dies die Ursache des Problems ist – Sean
Ü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